Bonjour. Cette fois, frappons l'API Web sur Android. Je vais l'écrire pour que même ceux qui utilisent l'API Web pour la première fois puissent le lire. Il existe différentes manières d'accéder à l'API Web, mais utilisez la bibliothèque standard Java HttpURLConnection
. Il n'y a pas de paramètres compliqués, et je pense que c'est une méthode orthodoxe si elle est utilisée pour accéder à l'API Web.
Si vous appuyez sur WebAPI, vous recevrez JSON
comme valeur de retour, mais comme il est difficile de formater JSON et de le sortir à l'écran sur Android, nous implémenterons Android en utilisant la commande curl
. Je vais. Lorsque vous utilisez WebAPI, je pense qu'il sera beaucoup plus facile de travailler avec la commande curl.
L'environnement de développement est le suivant. *Android Studio 4.0.1 *targetSdkVersion 28 *Google Nexus 5x
commande curl *Ubuntu 20.04 LTS (WSL 2)
Si vous souhaitez créer une application de paroles de musique ou pensez à créer une application de traduction. Il faut du temps et des efforts pour collecter des données sur les paroles de la musique qui augmentent en temps réel, et pour collecter les données pour créer une fonction de traduction. S'il est difficile de le fabriquer vous-même, je pense que vous utiliserez la bibliothèque. Que faire si vous ne trouvez pas la bibliothèque standard ou la bibliothèque externe même si vous les recherchez. Que faire si vous souhaitez gérer des données qui changent en temps réel, telles que les paroles, ou si vous souhaitez utiliser une bibliothèque qui ne dépend pas du langage de programmation. Vous devriez rechercher l'API Web.
WebAPI n'est pas dépendant de la langue et est souvent lié à une base de données, il est donc bon pour gérer des données en temps réel et d'énormes quantités de données. Comme la communication HTTP est utilisée, une connexion Internet est un prérequis, mais dans le cas d'Android, il est naturel que vous puissiez toujours vous connecter à Internet, donc il n'y a pas de problème même si vous créez une application à l'aide de l'API Web. Notez que vous devez être prudent lorsque l'API Web ne peut pas être utilisée temporairement en raison d'une maintenance ou lorsque les spécifications sont modifiées.
Si vous l'expliquez strictement, cela sera difficile à comprendre, donc si vous expliquez grossièrement avec un peu de flou sur la signification de chaque terme, WebAPI se réfère à la partie ou à l'interface du service Web à laquelle le développeur peut accéder à partir du programme. L'accès à WebAPI par programme est appelé une demande et le renvoi du résultat de la demande est appelé une réponse. Pour envoyer une requête, vous devez spécifier l'URL et la méthode HTTP. La méthode HTTP utilise les plus basiques GET
et POST
. Les détails de la façon d'envoyer la demande et de la réponse sont les suivants.
demande
URL | Méthode HTTP |
---|---|
http://example.com/api/get |
GET |
http://example.com/api/post |
POST |
réponse
{
"name": "foge"
}
De cette façon, lorsque vous faites une demande, la réponse sera renvoyée sous la forme JSON
. La méthode GET est principalement utilisée pour acquérir des données, et la méthode POST est principalement utilisée lorsque vous souhaitez inclure des données dans une requête et l'envoyer.
Divers tests peuvent être effectués en ajoutant les paramètres spécifiés après l'URL http: // httpbin.org
. Cette fois, nous utiliserons les fonctions suivantes.
une fonction | URL |
---|---|
Obtention d'une adresse IP | http://httpbin.org/ip |
GET demande de test | http://httpbin.org/get |
Test de la requête POST | http://httpbin.org/post |
Si vous souhaitez utiliser la commande curl sous Windows, installez WSL2
ou installez la commande curl pour Windows. WSL2 est le moyen le plus simple d'utiliser l'environnement Linux sous Windows, il est donc facile à configurer. Je n'aborderai pas ici la méthode d'installation.
La commande curl peut être utilisée à diverses fins, mais elle est souvent utilisée lors des requêtes HTTP. Maintenant, frappons l'API Web en utilisant httpbin
.
Utilisez la méthode GET pour obtenir l'adresse IP et tester la requête GET. La commande curl fait une requête GET si aucune option n'est ajoutée.
demande
curl http://httpbin.org/ip
réponse
{
"origin": "111.111.111.111" #l'adresse IP est différente pour chacun
}
demande
curl http://httpbin.org/get
réponse
{
"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"
}
Pour faire une requête POST, spécifiez la méthode HTTP avec l'option -X
de la commande curl. Avec -d
, vous pouvez décrire les données à inclure dans la requête POST. Dans httpbin, les données incluses dans la requête sont définies dans la valeur de retour «« form »». Lors de l'envoi de JSON, il est nécessaire de spécifier Content-Type
. Utilisez l'option d'en-tête de demande -H
.
demande
curl -X POST -H 'Content-Type: application/json' -d "name=foge&type=fogefoge" http://httpbin.org/post
réponse
{
"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"
}
Sur Android, il n'est pas possible de formater et d'afficher le résultat de la réponse aussi facilement que la commande curl. Je pense qu'il est préférable d'accéder à l'API Web sur Android tout en vérifiant si l'URL appropriée peut être spécifiée à l'aide de la commande curl et si la sortie est correcte. Cette fois, je voudrais obtenir les informations nécessaires sur Android tout en utilisant le résultat de curl exécuté ci-dessus.
Tout d'abord, pour vous connecter à Internet, écrivez ce qui suit dans ʻAndroidManifest.xml`.
<uses-permission android:name="android.permission.INTERNET"/>
HttpURLConnection
Avant de commencer la communication, vous devez définir certains paramètres de connexion. Il est résumé dans le tableau ci-dessous.
Paramètres de connexion | La description |
---|---|
Délai de connection dépassé | Limitation du temps que la méthode de connexion peut prendre pour se connecter. |
Délai de lecture | Temps nécessaire pour acquérir les données (temps nécessaire pour faire une demande et retourner une réponse) |
User-Agent | Stocke des informations telles que les logiciels et le système d'exploitation qui font des demandes(IciEstfacileàcomprendre) |
Accept-Language | Indique quelle langue le client peut comprendre et quel type de paramètres régionaux est recommandé |
Méthode HTTP | Pour dire au serveur quoi faire |
Autorisation d'envoyer le corps de la demande | Autorisation de stocker et d'envoyer des données dans le corps de la demande |
Autorisation de réception du corps de réponse | Autoriser à recevoir des données stockées dans le corps de la réponse |
Maintenant, montrons un programme qui effectue réellement une communication HTTP en utilisant HttpURLConnection
. Puisque HttpURLConnection
ne peut pas être exécuté dans le thread d'interface utilisateur, il est nécessaire de créer un autre thread et de l'exécuter.
Tout d'abord, faites une demande GET pour obtenir l'adresse IP.
public String getAPI(){
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
String result = "";
String str = "";
try {
URL url = new URL("http://httpbin.org/ip");
//Ouvrez une connexion à l'URL de destination. Pas encore connecté
urlConnection = (HttpURLConnection) url.openConnection();
//Définir le délai d'expiration de la connexion
urlConnection.setConnectTimeout(10000);
//Définir le délai de lecture des données de réponse
urlConnection.setReadTimeout(10000);
//Utilisateur dans l'en-tête-Définir l'agent
urlConnection.addRequestProperty("User-Agent", "Android");
//Accepter dans l'en-tête-Définir la langue
urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
//Spécifiez la méthode HTTP
urlConnection.setRequestMethod("GET");
//Ne pas autoriser la soumission du corps de la demande
urlConnection.setDoOutput(false);
//Autoriser la réception du corps de réponse
urlConnection.setDoInput(true);
//Commencer la communication
urlConnection.connect();
//Obtenir le code de réponse
int statusCode = urlConnection.getResponseCode();
//Le code de réponse 200 indique que la communication a réussi
if (statusCode == 200){
inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
//Obtenez le résultat de la réponse ligne par ligne et ajoutez-le à str
result = bufferedReader.readLine();
while (result != null){
str += result;
result = bufferedReader.readLine();
}
bufferedReader.close();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Renvoie le JSON du résultat de la réponse sous forme de type String
return str;
}
Ensuite, faites une demande POST.
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");
//Ouvrez une connexion à l'URL de destination. Pas encore connecté
urlConnection = (HttpURLConnection) url.openConnection();
//Données à stocker dans le corps de la demande
String postData = "name=foge&type=fogefoge";
//Définir le délai d'expiration de la connexion
urlConnection.setConnectTimeout(10000);
//Définir le délai de lecture des données de réponse
urlConnection.setReadTimeout(10000);
//Utilisateur dans l'en-tête-Définir l'agent
urlConnection.addRequestProperty("User-Agent", "Android");
//Accepter dans l'en-tête-Définir la langue
urlConnection.addRequestProperty("Accept-Language", Locale.getDefault().toString());
//Spécifiez la méthode HTTP
urlConnection.setRequestMethod("POST");
//Autoriser la réception du corps de réponse
urlConnection.setDoInput(true);
//Autoriser la soumission du corps de la demande
urlConnection.setDoOutput(true);
//Commencer la communication
urlConnection.connect();
//Ecrire le corps de la requête
outputStream = urlConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
bufferedWriter.write(postData);
bufferedWriter.flush();
bufferedWriter.close();
//Obtenir le code de réponse
int statusCode = urlConnection.getResponseCode();
//Le code de réponse 200 indique que la communication a réussi
if (statusCode == 200){
inputStream = urlConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//Obtenez le résultat de la réponse ligne par ligne et ajoutez-le à str
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();
}
//Renvoie le JSON du résultat de la réponse sous forme de type String
return str;
}
À la suite de la communication HTTP décrite ci-dessus, JSON peut être acquis sous forme de chaîne de caractères. Créez un objet JSON à partir de la chaîne de caractères et extrayez le contenu.
** Extrayez l'adresse IP de la valeur de retour de la requête GET **
//Obtenez la valeur de retour de la fonction de requête GET. Voir l'implémentation de la requête GET ci-dessus.
response = getAPI();
//Créez un objet JSON à partir d'une chaîne de caractères et utilisez-le comme racine.
JSONObject rootJSON = new JSONObject(response);
//http avec curl://httpbin.org/Reportez-vous au résultat de sortie lors de la demande d'ip
//Directement en dessous de la route"origin"Récupère la valeur (chaîne de caractères) de la clé
ip = rootJSON.getString("origin");
** Extraire la valeur définie dans le corps de la requête à partir de la valeur de retour de la requête POST **
À partir du résultat de sortie d'une requête POST avec la commande curl, il peut être confirmé que la valeur définie dans le corps de la requête est stockée sous «« form »». Extrayez la valeur du corps de la requête stockée sous " form "
.
//Obtenez la valeur de retour de la fonction de requête POST. Voir l'implémentation de la requête POST ci-dessus.
response = getPOST();
//Créez un objet JSON à partir d'une chaîne de caractères et utilisez-le comme racine.
JSONObject rootJSON = new JSONObject(response);
//Directement en dessous de la route"form"Obtenez JSONObject
JSONObject formJSON = rootJSON.getJSONObject("form");
// "form"Directement sous JSONObject"name"avec clé"type"Obtenir la valeur de la clé (chaîne de caractères)
nameAndType = formJSON.getString("name") + "/" + formJSON.getString("type");
Basé sur ce qui précède, l'exemple de code est affiché.
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>