** Update 2019/04/25 ** Hier finden Sie eine Zusammenfassung der Mittel für die HTTP-Kommunikation unter Android.
Aufgrund serverseitiger Trends und sich ändernder Programmierparadigmen werden weiterhin neue und nützliche Bibliotheken entstehen.
https://developer.android.com/reference/java/net/HttpURLConnection.html
Example
■ ** GET ** Beispielcode mit HttpUrlConnection
GET
public static String get(String endpoint, String encoding, Map<String, String> headers) throws IOException {
final int TIMEOUT_MILLIS = 0;//Timeout Millisekunde: 0 ist unendlich
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);//Zeit zum Verbinden
httpConn.setReadTimeout(TIMEOUT_MILLIS);//Zeit zum Lesen von Daten
httpConn.setRequestMethod("GET");//HTTP-Methode
httpConn.setUseCaches(false);//Verwendung des Cache
httpConn.setDoOutput(false);//Senden des Anforderungshauptteils zulassen(Falsch für GET,Für POST auf true setzen)
httpConn.setDoInput(true);//Erlauben Sie den Empfang einer Antwort
//HTTP-Header festlegen
if (headers != null) {
for (String key : headers.keySet()) {
httpConn.setRequestProperty(key, headers.get(key));//HTTP-Header festlegen
}
}
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 {
//befestigen sicher und Java1.6 konforme enge Verarbeitung
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();
}
Wie rufe ich GET auf?
//HTTP-Header(Wenn Sie angeben möchten)
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 ** mit HttpUrlConnection (Beispiel für das POSTing einer JSON-Zeichenfolge)
POST
public static String post(String endpoint, String encoding, Map<String, String> headers, String jsonString) throws IOException {
final int TIMEOUT_MILLIS = 0;//Timeout Millisekunde: 0 ist unendlich
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);//Zeit zum Verbinden
httpConn.setReadTimeout(TIMEOUT_MILLIS);//Zeit zum Lesen von Daten
httpConn.setRequestMethod("POST");//HTTP-Methode
httpConn.setUseCaches(false);//Verwendung des Cache
httpConn.setDoOutput(true);//Senden des Anforderungshauptteils zulassen(Falsch für GET,Für POST auf true setzen)
httpConn.setDoInput(true);//Erlauben Sie den Empfang einer Antwort
if (headers != null) {
for (String key : headers.keySet()) {
httpConn.setRequestProperty(key, headers.get(key));//HTTP-Header festlegen
}
}
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 {
//befestigen sicher und Java1.6 konforme enge Verarbeitung
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();
}
So rufen Sie POST an
String postJson = "[{\"message\":{\"number\":\"1\",\"value\":\"Hello\"}}]";
Map<String, String> headers = new HashMap<String, String>(); //HTTP-Header(Wenn Sie angeben möchten)
headers.put("X-Example-Header", "Example-Value");
String postResult = post("http://hogehoge/foofoo", "UTF-8", headers, postJson);
Obwohl es entgleist, hat java.net.HttpURLConnection der Android-Version dieselbe Schnittstelle wie das ursprüngliche JDK, aber die Java-Implementierung von Android unterscheidet sich vom ursprünglichen Oracle JDK (* 1), sodass es mit der von Oracle erstellten Java-Laufzeit funktioniert. Trotzdem funktionierte es unter Android oft nicht. (* 2)
(* 1) Android JDK wurde von Apache Harmony Base zu OpenJDK Base geändert. (* 2) Wenn Sie die mit Pure Java (nur) getestete Bibliothek so wie sie ist bringen, wird es weh tun.
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);
Auszug aus 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
So führen Sie eine REST-Operation (Request) mit OkHttp3 durch
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();
//Synchroner Anruf
Response response = client.newCall(request).execute();
//Ergebnisse anzeigen
System.out.println(response.body().string());
}
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();
//Synchroner Anruf
Response response = client.newCall(request).execute();
//Ergebnisse anzeigen
System.out.println(response.body().string());
}
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)//POST-Spezifikation
.build();
OkHttpClient client = new OkHttpClient.Builder()
.build();
//Synchroner Anruf
Response response = client.newCall(request).execute();
//Ergebnisse anzeigen
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();//Synchroner Anruf
DELETE
final Request request = new Request.Builder()
.url(url)
.delete()
.build();
OkHttpClient client = new OkHttpClient.Builder()
.build();
Response response = client.newCall(request).execute();//Synchroner Anruf
** Synchroner Anruf **
OkHttpClient client = new OkHttpClient.Builder()
.build();
Response response = client.newCall(request).execute();
** Asynchroner Anruf **
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();
//Handler beim Aktualisieren der Ansicht#post()Machen
}
@Override
public void onFailure(Call call, IOException arg1) {
}
});
Retrofit2 http://square.github.io/retrofit/
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);
(Auszug aus http://square.github.io/retrofit/)
Ich möchte JSON einer Modellklasse (POJO) zuordnen.
Generieren Sie automatisch Modellklassen für GSON und Jackson aus dem unformatierten JSON- und JSON-Schema
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
** Einstellungsbeispiel **
build.gradle
compile 'com.google.code.gson:gson:2.8.5'
■ Jackson https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
** (Bonus) Vorsichtsmaßnahmen bei Verwendung von Jackson als JSON-Parser unter Android **
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.6'
Beim Erstellen von gradle wird die JACKSON LICENSE-Datei dupliziert und die folgende Fehlermeldung wird angezeigt.
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
Es ist eine gute Idee, Folgendes in build.gradle auf App-Ebene zu schreiben.
#### **`build.gradle`**
```groovy
android {
Unterlassung
packagingOptions {
exclude 'META-INF/LICENSE'
}
}
Die Funktionsweise von JSON ist in ↓ ausführlich zusammengefasst Konvertieren Sie JSON in Java, Java in JSON - Verwendung von GSON und Jackson-
RxJava/RxAndroid https://mvnrepository.com/artifact/io.reactivex/rxandroid https://mvnrepository.com/artifact/io.reactivex/rxjava
Recommended Posts