[JAVA] * Android * [HTTP communication_1] Essayez d'accéder à l'API Web [GET, POST]

introduction

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.

supposition

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)

Pourquoi utiliser l'API Web

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.

Comment utiliser WebAPI

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.

Quelle API Web utiliser

À propos de httpbin

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

commande curl

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"
}

Accédez à l'API Web sur Android

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;
}

Traitement JSON

À 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é.

Exemple de code

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>

Page que vous voulez voir

Recommended Posts

* Android * [HTTP communication_1] Essayez d'accéder à l'API Web [GET, POST]
OkHttp3 (GET, POST) dans Android Studio
Essayez la communication en utilisant gRPC sur un serveur Android + Java
Communication HTTP / HTTPS
[Java] Comment obtenir une requête par communication HTTP