[JAVA] * Android * [HTTP-Kommunikation_1] Versuchen Sie, die Web-API [GET, POST] zu aktivieren.

Einführung

Hallo. Lassen Sie uns diesmal die Web-API auf Android aktivieren. Ich werde es schreiben, damit auch diejenigen, die zum ersten Mal auf die Web-API zugreifen, es lesen können. Es gibt verschiedene Möglichkeiten, die Web-API aufzurufen. Verwenden Sie jedoch die Java-Standardbibliothek "HttpURLConnection". Es gibt keine komplizierten Einstellungen, und ich denke, es ist eine orthodoxe Methode, wenn sie zum Aufrufen der Web-API verwendet wird.

Wenn Sie auf WebAPI klicken, erhalten Sie "JSON" als Rückgabewert. Da es jedoch schwierig ist, JSON zu formatieren und unter Android auf dem Bildschirm auszugeben, implementieren wir Android mit dem Befehl "curl". Ich werde. Bei der Verwendung von WebAPI wird es meiner Meinung nach viel einfacher sein, mit dem Befehl curl zu arbeiten.

Annahme

Die Entwicklungsumgebung ist wie folgt. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x

Curl-Befehl *Ubuntu 20.04 LTS (WSL 2)

Warum Web-API verwenden?

Wenn Sie eine Musik-Text-App erstellen oder eine Übersetzungs-App erstellen möchten. Es erfordert Zeit und Mühe, Daten über die Texte von Musik zu sammeln, die in Echtzeit zunehmen, und die Daten zu sammeln, um eine Übersetzungsfunktion zu erstellen. Wenn es schwierig ist, es selbst zu machen, werden Sie wahrscheinlich die Bibliothek benutzen. Was tun, wenn Sie die Standardbibliothek oder die externe Bibliothek nicht finden können, auch wenn Sie danach suchen? Was tun, wenn Sie Daten verarbeiten möchten, die sich in Echtzeit ändern, z. B. Texte, oder wenn Sie eine Bibliothek verwenden möchten, die nicht von der Programmiersprache abhängt? Sie sollten nach der Web-API suchen.

WebAPI ist nicht sprachabhängig und wird häufig mit einer Datenbank verknüpft. Daher kann es gut mit Echtzeitdaten und großen Datenmengen umgehen. Da die HTTP-Kommunikation verwendet wird, ist eine Internetverbindung eine Voraussetzung. Bei Android ist es jedoch selbstverständlich, dass Sie jederzeit eine Verbindung zum Internet herstellen können, sodass auch dann kein Problem besteht, wenn Sie eine Anwendung mithilfe der Web-API erstellen. Beachten Sie, dass Sie vorsichtig sein müssen, wenn die Web-API aufgrund von Wartungsarbeiten nicht vorübergehend verwendet werden kann oder die Spezifikationen geändert werden.

Verwendung von WebAPI

Wenn Sie es streng erklären, ist es schwer zu verstehen. Wenn Sie also die Bedeutung der einzelnen Begriffe grob und vage erläutern, bezieht sich WebAPI auf den Teil oder die Schnittstelle des Webdienstes, auf den der Entwickler über das Programm zugreifen darf. Der programmgesteuerte Zugriff auf die WebAPI wird als Anforderung bezeichnet, und die Rückgabe des Ergebnisses der Anforderung wird als Antwort bezeichnet. Um eine Anfrage zu senden, müssen Sie die URL und die HTTP-Methode angeben. Die HTTP-Methode verwendet die grundlegendsten "GET" und "POST". Die Einzelheiten zum Senden der Anfrage und zur Antwort lauten wie folgt.

Anfrage

URL HTTP-Methode
http://example.com/api/get GET
http://example.com/api/post POST

Antwort

{
    "name": "foge"
}

Auf diese Weise wird die Antwort bei einer Anfrage in der Form "JSON" zurückgegeben. Die GET-Methode wird hauptsächlich zum Erfassen von Daten verwendet, und die POST-Methode wird hauptsächlich verwendet, wenn Sie Daten in eine Anforderung aufnehmen und senden möchten.

Welche Web-API soll verwendet werden?

Über httpbin

Verschiedene Tests können durchgeführt werden, indem die angegebenen Parameter nach der URL "http: // httpbin.org" hinzugefügt werden. Dieses Mal werden wir die folgenden Funktionen verwenden.

Funktion URL
IP-Adresse erhalten http://httpbin.org/ip
GET-Anforderungstest http://httpbin.org/get
POST-Anfrage testen http://httpbin.org/post

Curl-Befehl

Wenn Sie den Befehl curl unter Windows verwenden möchten, installieren Sie "WSL2" oder den Befehl "curl" für Windows. WSL2 ist der einfachste Weg, die Linux-Umgebung unter Windows zu verwenden, daher ist die Einrichtung einfach. Ich werde hier nicht auf die Installationsmethode eingehen. Der Befehl curl kann für verschiedene Zwecke verwendet werden, wird jedoch häufig bei HTTP-Anforderungen verwendet. Lassen Sie uns nun die Web-API mit "httpbin" aufrufen.

Verwenden Sie die GET-Methode, um die IP-Adresse abzurufen und die GET-Anforderung zu testen. Der Befehl curl sendet eine GET-Anforderung, wenn keine Optionen hinzugefügt werden.


Anfrage

curl http://httpbin.org/ip

Antwort

{
  "origin": "111.111.111.111" #Die IP-Adresse ist für jeden unterschiedlich
}

Anfrage

curl http://httpbin.org/get

Antwort

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.68.0",
    "X-Amzn-Trace-Id": "Root=1-5f4f2fa5-80f8b602a2eec73861aa12e8"
  },
  "origin": "111.111.111.111",
  "url": "http://httpbin.org/get"
}

Um eine POST-Anforderung zu stellen, geben Sie die HTTP-Methode mit der Option -X des Befehls curl an. Mit -d können Sie die Daten beschreiben, die in die POST-Anforderung aufgenommen werden sollen. In httpbin werden die in der Anforderung enthaltenen Daten im Rückgabewert "form" festgelegt. Beim Senden von JSON muss "Content-Type" angegeben werden. Verwenden Sie die Anforderungsheaderoption "-H".

Anfrage

curl -X POST -H 'Content-Type: application/json' -d "name=foge&type=fogefoge" http://httpbin.org/post

Antwort

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "name": "foge"
    "type": "fogefoge"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "9",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.68.0",
    "X-Amzn-Trace-Id": "Root=1-5f4f32d3-65c03ae0882434bae32b8070"
  },
  "json": null,
  "origin": "111.111.111.111",
  "url": "http://httpbin.org/post"
}

Klicken Sie auf die Web-API unter Android

Unter Android ist es nicht möglich, das Antwortergebnis so einfach zu formatieren und anzuzeigen wie den Befehl curl. Ich denke, es ist besser, die Web-API unter Android aufzurufen, während überprüft wird, ob die entsprechende URL mit dem Befehl curl angegeben werden kann und ob die Ausgabe korrekt ist. Dieses Mal möchte ich die notwendigen Informationen auf Android erhalten, während ich das oben ausgeführte Ergebnis der Locke verwende.

Um eine Verbindung zum Internet herzustellen, schreiben Sie zunächst Folgendes in "AndroidManifest.xml".

<uses-permission android:name="android.permission.INTERNET"/>

HttpURLConnection

Bevor Sie mit der Kommunikation beginnen, müssen Sie einige Verbindungseinstellungen vornehmen. Es ist in der folgenden Tabelle zusammengefasst.

Verbindungseinstellungen Erläuterung
Verbindungszeitüberschreitung Begrenzung der Zeit, die für die Verbindung mit der Verbindungsmethode erforderlich ist.
Zeitüberschreitung lesen Zeitaufwand für die Datenerfassung (Zeitaufwand für die Anforderung und Rückgabe einer Antwort)
User-Agent Speichert Informationen wie Software und Betriebssystem, die Anforderungen stellen(HierIstleichtzuverstehen)
Accept-Language Gibt an, welche Sprache der Client verstehen kann und welche Art von Gebietsschema empfohlen wird
HTTP-Methode Um dem Server mitzuteilen, was zu tun ist
Berechtigung zum Senden des Anfragetexts Berechtigung zum Speichern und Senden von Daten im Anforderungshauptteil
Erlaubnis zum Empfang des Antwortkörpers Ermöglichen den Empfang von Daten, die im Antworttext gespeichert sind

Lassen Sie uns nun ein Programm zeigen, das tatsächlich eine HTTP-Kommunikation mit HttpURLConnection durchführt. Da HttpURLConnection im UI-Thread nicht ausgeführt werden kann, muss ein weiterer Thread erstellt und ausgeführt werden. Stellen Sie zunächst eine GET-Anfrage, um die IP-Adresse zu erhalten.

public String getAPI(){
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;
    String result = "";
    String str = "";
    try {
        URL url = new URL("http://httpbin.org/ip");
        //Öffnen Sie eine Verbindung zur Ziel-URL. Noch nicht verbunden
        urlConnection = (HttpURLConnection) url.openConnection();
        //Stellen Sie das Verbindungszeitlimit ein
        urlConnection.setConnectTimeout(10000);
        //Stellen Sie das Zeitlimit für das Lesen der Antwortdaten ein
        urlConnection.setReadTimeout(10000);
        //Benutzer in der Kopfzeile-Agent einstellen
        urlConnection.addRequestProperty("User-Agent", "Android");
        //In der Kopfzeile akzeptieren-Sprache einstellen
        urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
        //Geben Sie die HTTP-Methode an
        urlConnection.setRequestMethod("GET");
        //Erlauben Sie nicht die Einreichung des Anfragetextes
        urlConnection.setDoOutput(false);
        //Empfang des Antwortkörpers zulassen
        urlConnection.setDoInput(true);
        //Starten Sie die Kommunikation
        urlConnection.connect();
        //Antwortcode abrufen
        int statusCode = urlConnection.getResponseCode();
        //Der Antwortcode 200 zeigt an, dass die Kommunikation erfolgreich war
        if (statusCode == 200){
            inputStream = urlConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
            //Holen Sie sich das Antwortergebnis Zeile für Zeile und fügen Sie es str hinzu
            result = bufferedReader.readLine();
            while (result != null){
                str += result;
                result = bufferedReader.readLine();
            }
            bufferedReader.close();
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //Gibt den JSON des Antwortergebnisses als String-Typ zurück
    return str;
}

Stellen Sie als Nächstes eine POST-Anfrage.

public String postAPI(){
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;
    OutputStream outputStream = null;
    String result = "";
    String str = "";
    try {
        URL url = new URL("http://httpbin.org/post");
        //Öffnen Sie eine Verbindung zur Ziel-URL. Noch nicht verbunden
        urlConnection = (HttpURLConnection) url.openConnection();
        //Daten, die im Anforderungshauptteil gespeichert werden sollen
        String postData = "name=foge&type=fogefoge";
        //Stellen Sie das Verbindungszeitlimit ein
        urlConnection.setConnectTimeout(10000);
        //Stellen Sie das Zeitlimit für das Lesen der Antwortdaten ein
        urlConnection.setReadTimeout(10000);
        //Benutzer in der Kopfzeile-Agent einstellen
        urlConnection.addRequestProperty("User-Agent", "Android");
        //In der Kopfzeile akzeptieren-Sprache einstellen
        urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
        //Geben Sie die HTTP-Methode an
        urlConnection.setRequestMethod("POST");
        //Empfang des Antwortkörpers zulassen
        urlConnection.setDoInput(true);
        //Zulassen der Übermittlung des Anforderungshauptteils
        urlConnection.setDoOutput(true);
        //Starten Sie die Kommunikation
        urlConnection.connect();
        //Schreiben Sie den Anforderungshauptteil
        outputStream = urlConnection.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
        bufferedWriter.write(postData);
        bufferedWriter.flush();
        bufferedWriter.close();
        
        //Antwortcode abrufen
        int statusCode = urlConnection.getResponseCode();
        //Der Antwortcode 200 zeigt an, dass die Kommunikation erfolgreich war
        if (statusCode == 200){
            inputStream = urlConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            //Holen Sie sich das Antwortergebnis Zeile für Zeile und fügen Sie es str hinzu
            result = bufferedReader.readLine();
            while (result != null){
                str += result;
                result = bufferedReader.readLine();
            }
            bufferedReader.close();
        }
        urlConnection.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    //Gibt den JSON des Antwortergebnisses als String-Typ zurück
    return str;
}

JSON-Verarbeitung

Aufgrund der oben beschriebenen HTTP-Kommunikation kann JSON als Zeichenfolge erworben werden. Erstellen Sie ein JSON-Objekt aus der Zeichenfolge und extrahieren Sie den Inhalt.


** Extrahieren Sie die IP-Adresse aus dem Rückgabewert der GET-Anforderung **

//Ruft den Rückgabewert der GET-Anforderungsfunktion ab. Siehe die Implementierung der GET-Anforderung oben.
response = getAPI();
//Erstellen Sie ein JSON-Objekt aus einer Zeichenfolge und verwenden Sie dieses als Stamm.
JSONObject rootJSON = new JSONObject(response); 
//http mit locken://httpbin.org/Beziehen Sie sich auf das Ausgabeergebnis, wenn Sie eine IP anfordern
//Direkt unter der Route"origin"Ruft den Wert (die Zeichenfolge) des Schlüssels ab
ip = rootJSON.getString("origin");

** Extrahieren Sie den im Anforderungshauptteil festgelegten Wert aus dem Rückgabewert der POST-Anforderung ** Aus dem Ausgabeergebnis einer POST-Anforderung mit dem Befehl curl kann bestätigt werden, dass der im Anforderungshauptteil festgelegte Wert in "Form" gespeichert ist. Extrahieren Sie den Wert des Anforderungshauptteils, der in "Form" gespeichert ist.

//Ruft den Rückgabewert der POST-Anforderungsfunktion ab. Siehe die Implementierung der POST-Anforderung oben.
response = getPOST();
//Erstellen Sie ein JSON-Objekt aus einer Zeichenfolge und verwenden Sie dieses als Stamm.
JSONObject rootJSON = new JSONObject(response);
//Direkt unter der Route"form"Holen Sie sich JSONObject
JSONObject formJSON = rootJSON.getJSONObject("form");
// "form"Direkt unter JSONObject"name"Mit Schlüssel"type"Holen Sie sich den Schlüsselwert (Zeichenfolge)
nameAndType = formJSON.getString("name") + "/" + formJSON.getString("type");

Basierend auf dem oben Gesagten wird der Beispielcode angezeigt.

Beispielcode

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.samplehttpconnection">
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java


package com.example.samplehttpconnection;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    private Handler handler = new Handler();
    private Button button;
    private Button button2;
    private TextView textView;
    private TextView textView2;
    private String urlIpText = "http://httpbin.org/ip";
    private String urlPostText = "http://httpbin.org/post";
    private String ip = "";
    private String nameAndType = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = findViewById(R.id.button);
        button2 = findViewById(R.id.button2);
        textView = findViewById(R.id.textView);
        textView2 = findViewById(R.id.textView2);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String response = "";
                        try {
                            response = getAPI();
                            JSONObject rootJSON = new JSONObject(response);
                            ip = rootJSON.getString("origin");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText(ip);
                            }
                        });
                    }
                });
                thread.start();
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String response = "";
                        try {
                            response = postAPI();
                            JSONObject rootJSON = new JSONObject(response);
                            JSONObject formJSON = rootJSON.getJSONObject("form");
                            nameAndType = formJSON.getString("name") + "/" + formJSON.getString("type");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                textView2.setText(nameAndType);
                            }
                        });

                    }
                });
                thread.start();
            }
        });
    }

    public String getAPI(){
        HttpURLConnection urlConnection = null;
        InputStream inputStream = null;
        String result = "";
        String str = "";
        try {
            URL url = new URL(urlIpText);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setConnectTimeout(10000);
            urlConnection.setReadTimeout(10000);
            urlConnection.addRequestProperty("User-Agent", "Android");
            urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(false);
            urlConnection.connect();
            int statusCode = urlConnection.getResponseCode();
            if (statusCode == 200){
                inputStream = urlConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
                result = bufferedReader.readLine();
                while (result != null){
                    str += result;
                    result = bufferedReader.readLine();
                }
                bufferedReader.close();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    public String postAPI(){
        HttpURLConnection urlConnection = null;
        InputStream inputStream = null;
        OutputStream outputStream = null;
        String result = "";
        String str = "";
        try {
            URL url = new URL(urlPostText);
            urlConnection = (HttpURLConnection) url.openConnection();
            String postData = "name=foge&type=fogefoge";
            urlConnection.setConnectTimeout(10000);
            urlConnection.setReadTimeout(10000);
            urlConnection.addRequestProperty("User-Agent", "Android");
            urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoInput(true);
            urlConnection.setDoOutput(true);
            urlConnection.connect();
            outputStream = urlConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
            bufferedWriter.write(postData);
            bufferedWriter.flush();
            bufferedWriter.close();

            int statusCode = urlConnection.getResponseCode();
            if (statusCode == 200){
                inputStream = urlConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                result = bufferedReader.readLine();
                while (result != null){
                    str += result;
                    result = bufferedReader.readLine();
                }
                bufferedReader.close();
            }

            urlConnection.disconnect();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

}

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="Hello World!"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="GET"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:text="Hello World!"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="POST"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>

Seite, die Sie sehen möchten

Recommended Posts

* Android * [HTTP-Kommunikation_1] Versuchen Sie, die Web-API [GET, POST] zu aktivieren.
OkHttp3 (GET, POST) in Android Studio
Versuchen Sie die Kommunikation mit gRPC auf einem Android + Java-Server
HTTP / HTTPS-Kommunikation
[Java] So erhalten Sie eine Anfrage per HTTP-Kommunikation