** 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.
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.
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/)
Je veux mapper JSON à une classe de modèle (POJO)
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-
RxJava/RxAndroid https://mvnrepository.com/artifact/io.reactivex/rxandroid https://mvnrepository.com/artifact/io.reactivex/rxjava
Recommended Posts