Bardzo nowy w rozwoju Androida. Próba wywołania usługi sieciowej w Android Studio i otrzymanie tego: java.net.SocketTimeoutException: upłynął limit czasu uzgadniania SSL. Nie widzę ruchu w wireshark i nie jestem pewien, w którym momencie jego awaria. Wydaje się, że nie opuszcza emulatora.

EDYCJA: Usługa internetowa zawiera trzy metody, z braku lepszego terminu. Nie jestem pewien, jak wywołać odpowiednią metodę w systemie Android. W PowerShell nazywam to tak:

PowerShell:

$myname = New-WebServiceProxy -Uri $URI -Namespace myname-class ssl
$myname.webservicemethod($qualifications,0,30)

Android:

public class MainActivity extends AppCompatActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.button2);
        final TextView textview = findViewById(R.id.textView);

         button.setOnClickListener(new View.OnClickListener()
         {
            @Override
            public void onClick(View v)
            {
                AsyncTask asyncTask = new AsyncTask()
                {
                    @Override
                    protected Object doInBackground(Object[] objects)
                    {
                        OkHttpClient client = new OkHttpClient();

                        HttpUrl.Builder urlBuilder = HttpUrl.parse("https://ip of webservice/pathvalue/WSDL/public/hostname/name").newBuilder();
                    urlBuilder.addQueryParameter("username", "someuser");
                    urlBuilder.addQueryParameter("password", "somepass");
                    urlBuilder.addQueryParameter("qualification", "Assigned Group=Admin Group");
                    String url = urlBuilder.build().toString();

                    Request request = new Request.Builder().url(url).build();
                    Response response = null;
                    try
                    {
                        response = client.newCall(request).execute();
                        return response.body().string();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
 return null;
                }

                @Override
                protected void onPostExecute(Object o)
                {
                    textview.setText(o.toString());

                }
            }.execute();
        }
        });
    }
}
0
Wei Wei 20 grudzień 2019, 00:32
Wygląda na to, że twój serwer nie odpowiada. czy sprawdziłeś to za pomocą curl, listonosza lub innych konstruktorów żądań http ...?
 – 
Mojtaba Haddadi
20 grudzień 2019, 00:48
Serwis internetowy, do którego dzwonię, działa. Mogę to nazwać i uzyskać poprawne wyniki z programu powershell, który napisałem, aby to przetestować.
 – 
Wei Wei
20 grudzień 2019, 01:09
Sprawdź konfiguracje emulatora. To może być firewall. Oto przydatny link developer.android.com/studio/run/emulator-networking
 – 
Christilyn Arjona
20 grudzień 2019, 01:15

1 odpowiedź

Podejrzewam, że zapobieganie SocketTimeoutException przekracza nasz limit. Jednym ze sposobów skutecznego obsłużenia tego jest zdefiniowanie limitu czasu połączenia, a następnie obsłużenie go za pomocą bloku try catch. Mam nadzieję, że to pomoże

HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(7000); //set the timeout in milliseconds
0
Omkar C. 20 grudzień 2019, 01:15