[JAVA] Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten

** 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.

HttpUrlConnection (Verwendung der Java-Standard-URLConnection ohne Verwendung der Bibliothek)

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.

Apache-Serie (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);

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/)

Tools für die HTTP-Kommunikation

JSON-Parser

Ich möchte JSON einer Modellklasse (POJO) zuordnen.

Eine Site, die bei Verwendung des JSON-Parsers automatisch Modellklassen generiert, die GSON und Jackson unterstützen

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-

Reaktive Programmierung

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

Recommended Posts

Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten
Wenn Sie explizit ODER oder UND mit Ransack schreiben möchten
docker-compose.yml, wenn Sie MySQL auf Docker laufen lassen möchten
lombok.config, wenn Sie @Qualifier mit lombok an @RequiredArgsConstructor übergeben möchten
Wenn Sie Java-Bibliothekstests mit Spock in mehreren Modulen mit Gradle in Android Studio 3 implementieren möchten
Sie können alles mit Ihrem Android-Smartphone oder -Tablet tun! Zusammenfassung von Arekore, um mit Termux zu ziehen
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
Das erste, was Sie tun müssen, wenn Sie mit Heroku auf GitHub mit Eclipse auf Java zufrieden sein möchten
Wenn Sie InputStream in JDBI3 binden möchten
Zusammenfassung des Mooses beim Update von JMockit 1.4 auf 1.30
Wenn Sie die Methode außerhalb verwenden möchten
[Ruby] Wenn Sie mehrere Zeichen ersetzen möchten
[Java-Tool] Ein nützliches Tool, wenn Sie das IPMSG-Protokoll von PC-A regelmäßig an den angegebenen PC senden möchten.
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
[Android Studio] Ich möchte eine Maven-Bibliothek unter Android verwenden
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
Ich möchte die Protokollausgabe unter Android vereinfachen
[Ruby + Rails] Wenn Sie sich zusammen mit der Benutzerregistrierung in der Mailchimp-Mailingliste registrieren möchten
So schreiben Sie in die Modellklasse, wenn Sie mit PlayFramework Binärdaten in der Datenbank speichern möchten
Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
Zusammenfassung der ersten Arbeiten beim Erstellen einer App mit Rails
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Tipps, wenn Sie beim Ersetzen einer Zeichenfolge viele Zeilenumbrüche und Tabulatoren einfügen möchten
Probleme mit SDK apk JDK usw., die beim Erstellen auf Android mit Unity fehlschlagen. "Apk konnte nicht erstellt werden"
Ich möchte SONY Kopfhörer WH-1000XM4 mit LDAC mit Ubuntu 20.04 verbinden! !!
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Ich möchte eine Browsing-Funktion mit Ruby on Rails hinzufügen
Ich möchte OutOfMemory bei der Ausgabe großer Dateien mit POI vermeiden
Zusammenfassung der Forschungsergebnisse zur Objektorientierung [Von Zeit zu Zeit aktualisiert]
So schreiben Sie bei der Installation von Amazon Corretto 8 unter CentOS 8 mit Ansible.
Wenn Sie devise eingeführt haben, aber weitere Spalten hinzufügen möchten
[Rails] Ich möchte beim Übergang mit link_to Daten zu Params hinzufügen
Üben Sie die Verwendung, wenn Sie verschiedene Verarbeitungsgruppen seriell ausführen möchten
Zusammenfassung der Probleme und Gegenmaßnahmen beim Betrieb des IE mit WebDriver of Selenium2
Zusammenfassung dessen, was wir getan haben, um JavaScript mit IE11 kompatibel zu machen
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]