web-dev-qa-db-fra.com

Comment puis-je faire une simple requête HTTP dans MainActivity.java? (Android Studio)

J'utilise Android Studio et j'ai passé quelques heures à essayer de faire une simple requête HTTP dans mon fichier MainActivity.Java. J'ai essayé de nombreuses façons et j'ai vu de nombreuses pages Web sur le sujet, mais je n'arrive pas à le comprendre.

Lorsque j'essaie OkHttp, j'obtiens une erreur pour ne pas pouvoir le faire sur le thread principal. Maintenant j'essaie de le faire de cette façon:

public static String getUrlContent(String sUrl) throws Exception {
    URL url = new URL(sUrl);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    connection.setDoOutput(true);
    connection.setConnectTimeout(5000);
    connection.setReadTimeout(5000);
    connection.connect();
    BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String content = "", line;
    while ((line = rd.readLine()) != null) {
        content += line + "\n";
    }
    return content;
}

J'ai mis cette méthode directement dans MainActivity.Java et mon événement click l'exécute à partir d'une autre méthode également présente dans MainActivity.Java:

try {
    String str = getUrlContent("https://example.com/WAN_IP.php");
    displayMessage(str);
}
catch(Exception e){
    displayMessage(e.getMessage());
}

Mais pour l'instant, il n'y a pas de crash, et je peux dire qu'il y a une exception levée sur la ligne qui commence "BufferedReader", mais e.getMessage () est vide.

Je suis un nouvel utilisateur d’Android Studio et de Java. Soyez donc gentil et aidez-moi à résoudre ce problème très élémentaire. Finalement, j'aurai besoin de poster des requêtes sur le serveur, et il semblerait qu'OkHttp soit la meilleure solution, mais je ne trouve pas le "Hello World" d'OkHttp dans Android Studio documenté où que ce soit en ligne.

5
Brian Gottier

Vous ne devriez pas faire de requêtes réseau sur le thread principal. Le délai est imprévisible et pourrait geler l'interface utilisateur.

Android force ce comportement en levant une exception si vous utilisez l'objet HttpUrlConnection à partir du thread principal.

Vous devez ensuite effectuer votre demande réseau en arrière-plan, puis mettre à jour l'interface utilisateur sur le thread principal. La classe AsyncTask peut être très pratique pour ce cas d'utilisation!

private class GetUrlContentTask extends AsyncTask<String, Integer, String> {
     protected String doInBackground(String... urls) {
        URL url = new URL(urls[0]);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setDoOutput(true);
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);
        connection.connect();
        BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String content = "", line;
        while ((line = rd.readLine()) != null) {
            content += line + "\n";
        }
        return content;
     }

     protected void onProgressUpdate(Integer... progress) {
     }

     protected void onPostExecute(String result) {
         // this is executed on the main thread after the process is over
         // update your UI here
         displayMessage(result);
     }
 }

Et vous commencez ce processus de cette façon:

new GetUrlContentTask().execute(sUrl)
12
Nicolas Dusart

Jetez un oeil à this answer. Il n'est pas possible d'ouvrir une connexion HTTP dans le thread principal (et c'est pourquoi vous avez cette première erreur) et utiliser AsyncTask est un bon moyen de gérer cela

0
Agata Cieplik

si vous utilisez okhttp, appelez async, essayez le code ci-dessous 

 private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();
     client.setConnectTimeout(15, TimeUnit.SECONDS);
    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Call call, IOException e) {
        e.printStackTrace();
      }

      @Override public void onResponse(Call call, Response response) throws IOException {
        if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

        Headers responseHeaders = response.headers();
        for (int i = 0, size = responseHeaders.size(); i < size; i++) {
          Log.e(responseHeaders.name(i) , responseHeaders.value(i));
        }

       Log.e("response",response.body().string());
      }
    });
  }
0
Chayon Ahmed