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.
Die Entwicklungsumgebung ist wie folgt. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x
Curl-Befehl *Ubuntu 20.04 LTS (WSL 2)
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.
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.
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 |
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"
}
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;
}
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.
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>
Recommended Posts