[JAVA] Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android

** Mise à jour du 25/04/2019 ** Voici un résumé des moyens de communication HTTP sur Android.

En raison des tendances côté serveur et de l'évolution des paradigmes de programmation, de nouvelles bibliothèques utiles continueront d'émerger.

HttpUrlConnection (Comment utiliser URLConnection standard Java sans utiliser la bibliothèque)

https://developer.android.com/reference/java/net/HttpURLConnection.html

--Avec le retrait d'Apache (Apache HttpClient, DefaultHttpClient, AndroidHttpClient), ceci est recommandé en tant qu'API de bas niveau. (Auparavant, il y avait un bug)

Example

■ ** GET ** exemple de code avec HttpUrlConnection

GET


    public static String get(String endpoint, String encoding, Map<String, String> headers) throws IOException {

        final int TIMEOUT_MILLIS = 0;//Timeout milliseconde: 0 est infini

        final StringBuffer sb = new StringBuffer("");

        HttpURLConnection httpConn = null;
        BufferedReader br = null;
        InputStream is = null;
        InputStreamReader isr = null;

        try {
            URL url = new URL(endpoint);
            httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setConnectTimeout(TIMEOUT_MILLIS);//Il est temps de se connecter
            httpConn.setReadTimeout(TIMEOUT_MILLIS);//Temps de lecture des données
            httpConn.setRequestMethod("GET");//Méthode HTTP
            httpConn.setUseCaches(false);//Utilisation du cache
            httpConn.setDoOutput(false);//Autoriser l'envoi du corps de la demande(Faux pour GET,Défini sur true pour POST)
            httpConn.setDoInput(true);//Autoriser la réception du corps de la réponse

            //Définir l'en-tête HTTP
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpConn.setRequestProperty(key, headers.get(key));//Définir l'en-tête HTTP
                }
            }
            httpConn.connect();

            final int responseCode = httpConn.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {

                is = httpConn.getInputStream();
                isr = new InputStreamReader(is, encoding);
                br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
            } else {
                // If responseCode is not HTTP_OK
            }

        } catch (IOException e) {
            throw e;
        } finally {
            //fortifier en toute sécurité et Java1.6 Traitement de clôture conforme
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                }
            }
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                }
            }
            if (httpConn != null) {
                httpConn.disconnect();
            }
        }
        return sb.toString();
    }

Comment appeler GET


        //En-tête HTTP(Si vous souhaitez spécifier)
        Map<String,String> headers=new HashMap<String,String>();
        headers.put("X-Example-Header","Example-Value");
        String resultStr = get("http://hogehoge/foofoo", "UTF-8", headers);

■ ** POST ** avec HttpUrlConnection (Exemple de POST d'une chaîne de caractères JSON)

POST


   public static String post(String endpoint, String encoding, Map<String, String> headers, String jsonString) throws IOException {

        final int TIMEOUT_MILLIS = 0;//Timeout milliseconde: 0 est infini

        final StringBuffer sb = new StringBuffer("");

        HttpURLConnection httpConn = null;
        BufferedReader br = null;
        InputStream is = null;
        InputStreamReader isr = null;

        try {
            URL url = new URL(endpoint);
            httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setConnectTimeout(TIMEOUT_MILLIS);//Il est temps de se connecter
            httpConn.setReadTimeout(TIMEOUT_MILLIS);//Temps de lecture des données
            httpConn.setRequestMethod("POST");//Méthode HTTP
            httpConn.setUseCaches(false);//Utilisation du cache
            httpConn.setDoOutput(true);//Autoriser l'envoi du corps de la demande(Faux pour GET,Défini sur true pour POST)
            httpConn.setDoInput(true);//Autoriser la réception du corps de la réponse

            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpConn.setRequestProperty(key, headers.get(key));//Définir l'en-tête HTTP
                }
            }

            OutputStream os = httpConn.getOutputStream();
            final boolean autoFlash = true;
            PrintStream ps = new PrintStream(os, autoFlash, encoding);
            ps.print(jsonString);
            ps.close();

            final int responseCode = httpConn.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {

                is = httpConn.getInputStream();
                isr = new InputStreamReader(is, encoding);
                br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null) {
                    sb.append(line);
                }
            } else {
                // If responseCode is not HTTP_OK
            }

        } catch (IOException e) {
            throw e;
        } finally {
            //fortifier en toute sécurité et Java1.6 Traitement de clôture conforme
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                }
            }
            if (isr != null) {
                try {
                    isr.close();
                } catch (IOException e) {
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                }
            }
            if (httpConn != null) {
                httpConn.disconnect();
            }
        }
        return sb.toString();
    }

Comment appeler POST


        String postJson = "[{\"message\":{\"number\":\"1\",\"value\":\"Hello\"}}]";
        Map<String, String> headers = new HashMap<String, String>(); //En-tête HTTP(Si vous souhaitez spécifier)
        headers.put("X-Example-Header", "Example-Value");
        String postResult = post("http://hogehoge/foofoo", "UTF-8", headers, postJson);

Bien que cela déraille, java.net.HttpURLConnection de la version Android a la même interface que le JDK d'origine, mais l'implémentation Java d'Android est différente du JDK Oracle d'origine (* 1), elle fonctionne donc avec le runtime Java créé par Oracle. Même ainsi, cela ne fonctionnait souvent pas sur Android. (* 2)

(* 1) Android JDK est passé de la base Apache Harmony à la base OpenJDK. (* 2) Si vous apportez la bibliothèque testée avec Pure Java (uniquement) telle quelle, cela fera mal.

Série Apache (Apache HttpClient, DefaultHttpClient, AndroidHttpClient)

https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html?hl=ja#behavior-apache-http-client

volley https://developer.android.com/training/volley/index.html

final TextView mTextView = (TextView) findViewById(R.id.text);
...

// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Display the first 500 characters of the response string.
        mTextView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("That didn't work!");
    }
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

Extrait de https://developer.android.com/training/volley/simple.html

OkHttp3 http://square.github.io/okhttp/

maven/gradle https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp

dependencies {
    compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.14.1'
}

Example

Comment effectuer une opération REST (Request) avec OkHttp3

GET

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

   public void doGet(String url) throws IOException {

        final Request request = new Request.Builder().url(url).build();
        final OkHttpClient client = new OkHttpClient.Builder().build();

        //Appel synchrone
        Response response = client.newCall(request).execute();
        //Voir les résultats
        System.out.println(response.body().string());
    }

POST

--Si vous souhaitez créer un POST

import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

   public void doFormPost(String url) throws IOException {
        final FormBody.Builder formBodyBuilder = new FormBody.Builder();
        formBodyBuilder.add("param_name", "param_value");

        final Request request = new Request.Builder()
                .url(url)
                .header("User-Agent", "Example client")
                .post(formBodyBuilder.build())
                .build();
        OkHttpClient client = new OkHttpClient.Builder()
                .build();
        //Appel synchrone
        Response response = client.newCall(request).execute();
        //Voir les résultats
        System.out.println(response.body().string());
    }

--Si vous souhaitez POSTER l'intégralité du JSON

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

    public void doPost(String url, String jsonString) throws IOException {
        okhttp3.MediaType mediaTypeJson = okhttp3.MediaType.parse("application/json; charset=utf-8");

        RequestBody requestBody = RequestBody.create(mediaTypeJson, jsonString);

        final Request request = new Request.Builder()
                .url(url)
                .post(requestBody)//Spécification POST
                .build();
        OkHttpClient client = new OkHttpClient.Builder()
                .build();
        //Appel synchrone
        Response response = client.newCall(request).execute();
        //Voir les résultats
        System.out.println(response.body().string());
    }

PUT

final Builder formBodyBuilder = new FormBody.Builder();
	formBodyBuilder.add("param_name","param_value");
	
	final Request request = new Request.Builder()
			.url(url)
			.put(formBodyBuilder.build())
			.build();
	OkHttpClient client = new OkHttpClient.Builder()
                .build();
	Response response = client.newCall(request).execute();//Appel synchrone

DELETE

	final Request request = new Request.Builder()
			.url(url)
			.delete()
			.build();
	OkHttpClient client = new OkHttpClient.Builder()
                .build();
	Response response = client.newCall(request).execute();//Appel synchrone

** Appel synchrone **

OkHttpClient client = new OkHttpClient.Builder()
				.build();
Response response = client.newCall(request).execute();

** Appel asynchrone **

OkHttpClient client = new OkHttpClient.Builder()
				.build();

client.newCall(request).enqueue(new okhttp3.Callback() {

@Override
public void onResponse(Call call, Response response) throws IOException {

final String resString = response.body().string();
 //gestionnaire lors de la mise à jour de la vue#post()Faire
}

@Override
public void onFailure(Call call, IOException arg1) {

}
});

Retrofit2 http://square.github.io/retrofit/ --Une bibliothèque appelée "Laissez-le à REST!" Par développeur OkHttp.

maven/gralde https://mvnrepository.com/artifact/com.squareup.retrofit2/retrofit

Example

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

(Extrait de http://square.github.io/retrofit/)

Outils utilisés avec la communication HTTP

Analyseur JSON

Je veux mapper JSON à une classe de modèle (POJO)

Un site qui génère automatiquement des classes de modèle prenant en charge GSON et Jackson lors de l'utilisation de l'analyseur JSON

Générez automatiquement des classes de modèle pour GSON et Jackson à partir du schéma JSON et JSON brut

http://www.jsonschema2pojo.org/

GSON https://mvnrepository.com/artifact/com.google.code.gson/gson

maven/gradle https://mvnrepository.com/artifact/com.google.code.gson/gson

** Exemple de réglage **

build.gradle


 compile 'com.google.code.gson:gson:2.8.5'

Jackson https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind

** (Bonus) Précautions lors de l'utilisation de Jackson comme analyseur JSON sur Android **

compile 'com.fasterxml.jackson.core:jackson-databind:2.8.6'



 Lors de la création de gradle, le fichier JACKSON LICENSE est dupliqué et le message d'erreur suivant apparaît.

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/LICENSE


 C'est une bonne idée d'écrire ce qui suit dans le build.gradle au niveau de l'application.


#### **`build.gradle`**
```groovy

android {
Omission
 packagingOptions {

        exclude 'META-INF/LICENSE'

    }
}

Le fonctionnement de JSON est résumé en détail dans ↓ Convertir JSON en Java, Java en JSON-Comment utiliser GSON et Jackson-

Programmation réactive

RxJava/RxAndroid https://mvnrepository.com/artifact/io.reactivex/rxandroid https://mvnrepository.com/artifact/io.reactivex/rxjava

Recommended Posts

Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
Vous pouvez tout faire avec votre smartphone ou tablette Android! Résumé d'Arekore pour déménager avec Termux
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
La première chose à faire lorsque vous voulez être satisfait d'Heroku sur GitHub avec Eclipse sur Java
Lorsque vous souhaitez lier InputStream dans JDBI3
Résumé de la mousse lors de la mise à jour de JMockit 1.4 vers 1.30
Lorsque vous souhaitez utiliser la méthode à l'extérieur
[Ruby] Lorsque vous souhaitez remplacer plusieurs caractères
[outil java] Un outil utile lorsque vous souhaitez envoyer régulièrement le journal ipmsg de PC-A au PC spécifié.
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
[Android Studio] Je souhaite utiliser une bibliothèque Maven sur Android
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
Je souhaite simplifier la sortie du journal sur Android
[Ruby + Rails] Lorsque vous souhaitez vous inscrire dans la liste de diffusion de Mailchimp avec l'enregistrement de l'utilisateur
Comment écrire dans la classe Model lorsque vous souhaitez enregistrer des données binaires dans DB avec PlayFramework
Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
Résumé du travail initial lors de la création d'une application avec Rails
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
Conseils lorsque vous souhaitez insérer de nombreux sauts de ligne et tabulations lors du remplacement d'une chaîne de caractères
Problèmes avec le SDK apk JDK etc. qui échouent lors de la construction sur Android avec Unity. "Échec de la construction de l'apk"
Je veux connecter un casque SONY WH-1000XM4 avec LDAC avec ubuntu 20.04! !!
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Je souhaite ajouter une fonction de navigation avec ruby on rails
Je veux éviter OutOfMemory lors de la sortie de gros fichiers avec POI
Résumé des résultats de la recherche sur l'orientation des objets [mis à jour de temps à autre]
Comment écrire lors de l'installation d'Amazon Corretto 8 sur CentOS 8 avec Ansible.
Lorsque vous avez introduit la devise mais que vous souhaitez ajouter plus de colonnes
[Rails] Je souhaite ajouter des données aux paramètres lors de la transition avec link_to
Pratique à utiliser lorsque vous souhaitez exécuter différents groupes de traitement en série
Résumé des problèmes et des contre-mesures lors de l'utilisation d'IE avec WebDriver de Selenium2
Résumé de ce que nous avons fait pour rendre JavaScript compatible avec IE11
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]