Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)

Android propose diverses options pour la communication Http et le traitement JSON, c'est donc difficile pour les personnes qui l'utilisent occasionnellement. .. .. OkHttp semble être populaire ces jours-ci, je vais donc l'essayer.

supposition

spécification

Pour le moment, si vous appuyez sur le bouton, vous voulez lancer l'API Web pour obtenir Json, l'analyser et l'afficher.

Installez le programme qui renvoie le Json suivant sur le serveur.

{"status":"OK","message":"Hello2019-05-31 07:06:23"}

L'image ci-dessous.

スクリーンショット 2019-05-31 7.08.57.png

Préparation

Préparez-en avant la mise en œuvre.

Autoriser l'accès à Internet

Ajoutez ce qui suit à AndroidManifest.xml. C'est naturel, mais parfois c'est trop naturel pour l'oublier.

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

Autorisation du domaine de communication (non-https)

Apparemment, une communication autre que https depuis Android 9.x entraînera une erreur. J'obtiens l'erreur suivante.

java.io.IOException: Cleartext HTTP traffic to hoge.com not permitted

hoge.com est le domaine ou sous-domaine auquel vous souhaitez accéder.

Un fichier de configuration est requis pour l'autoriser. C'est gênant, mais ça correspond.

Installation du fichier de configuration

Facilitez un fichier xml avec le contenu suivant. Il semble que le nom et l'emplacement du fichier peuvent être n'importe où (car ils seront explicitement spécifiés dans le processus suivant).

app/res/xml/network_security_config.xml


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">www.bluecode.jp</domain>
    </domain-config>
</network-security-config>

Spécification du fichier de paramètres

Spécifiez le fichier de configuration spécifié dans AndroidManifest.xml.

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.bluecode.http01">

    <application
+       android:networkSecurityConfig="@xml/network_security_config"
        android:allowBackup="true"
        ...

Paramètres OkHttp

Ajouter au module Grandle: application et synchronisation.

...
dependencies {
    ...
    implementation 'com.squareup.okhttp3:okhttp:4.0.0-alpha02'
}
...

C'est tout pour la préparation.

la mise en oeuvre

Enfin implémenté. Le traitement de la communication, etc. ne peut pas être effectué dans le thread principal pendant une longue période. Il est de notoriété publique qu'il est démarré dans un thread séparé et traité de manière asynchrone. OkHttp semble être décrit comme suit.

MainActivity.java

MainActivity.java


package jp.bluecode.http01;

import android.os.Handler;
import android.os.Looper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {

    //Déclaration de widget
    TextView txt01;
    Button btn01;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Initialisation du widget
        txt01 = findViewById(R.id.txt01);
        btn01 = findViewById(R.id.btn01);

        //Clic de bouton
        btn01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //demande http
                try{
                    //Fonction personnalisée utilisant okhttp (ci-dessous)
                    httpRequest("http://www.bluecode.jp/test/api.php");
                }catch(Exception e){
                    Log.e("Hoge",e.getMessage());
                }

            }
        });
    }

    void httpRequest(String url) throws IOException{

        //Génération OkHttpClinet
        OkHttpClient client = new OkHttpClient();

        //génération de demande
        Request request = new Request.Builder()
                .url(url)
                .build();

        //Requête asynchrone
        client.newCall(request)
                .enqueue(new Callback() {

                    //En cas d'erreur
                    @Override
                    public void onFailure(@NotNull Call call, @NotNull IOException e) {
                        Log.e("Hoge",e.getMessage());
                    }

                    //Quand normal
                    @Override
                    public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {

                        //récupération de réponse
                        final String jsonStr = response.body().string();
                        Log.d("Hoge","jsonStr=" + jsonStr);

                        //Traitement JSON
                        try{
                            //perspective json
                            JSONObject json = new JSONObject(jsonStr);
                            final String status = json.getString("status");

                            //Mise à jour de l'interface utilisateur du thread parent
                            Handler mainHandler = new Handler(Looper.getMainLooper());
                            mainHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    txt01.setText(status);
                                }
                            });


                        }catch(Exception e){
                            Log.e("Hoge",e.getMessage());
                        }

                    }
                });
    }
}

activity_main.xml

Je pense que vous pouvez implémenter la mise en page comme vous le souhaitez, mais à titre indicatif uniquement.

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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/txt01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="200dp"
        android:text="Hello World!"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btn01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/txt01" />

</android.support.constraint.ConstraintLayout>

référence

Recommended Posts

Accédez à l'API Web avec Get sur Android et traitez Json (Java pour le moment)
[First Java] Créez quelque chose qui fonctionne avec Intellij pour le moment
Utilisez une bibliothèque Java externe pour le moment
Exécutez Dataflow, Java, Streaming pour le moment
[Java] Obtenez et affichez la date 10 jours plus tard à l'aide de l'API Time ajoutée à partir de Java 8.
Impressions et doutes sur l'utilisation de Java pour la première fois dans Android Studio
[Deep Learning from scratch] en Java 1. Pour le moment, différenciation et différenciation partielle
Apprentissage pour la première fois des expressions et opérateurs Java # 3
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Hello World avec la bibliothèque d'extension Ruby pour le moment
Il est maintenant temps de commencer avec l'API Stream
[Memo] Exécutez Node.js v4.4.5 sur CentOS 4.9 / RHEL4 (i386) pour le moment (gcc-4.8 et glibc2.11 sur LinuxKernel 2.6.9)
Java14 est sorti, alors j'ai essayé d'enregistrer pour le moment
Installez le plugin memcached sur MySQL et accédez à partir de Java
Obtenez l'accélération et l'orientation du système de coordonnées mondial sur Android
[Android] Obtenez la date du lundi
Construire un serveur DLNA sur Ubuntu (il suffit de bouger pour le moment)
Java12 est sorti, alors j'ai essayé l'expression switch pour le moment
Attendez que PostgreSQL démarre avec Docker, puis démarrez le service WEB
Les débutants créent des applications Web avec Java et MySQL (ajout à tout moment)
Transition d'activité avec refactoring de classe JAVA et instance expérimentée côté Android
Développement Android-Accès WEB (GET) Essayez d'obtenir des données en communiquant avec l'extérieur. ~
Créer une application et la déployer pour la première fois avec heroku
Introduction à Java pour la première fois # 2
[Java 7] Divisez la liste Java et exécutez le processus
Apprendre pour la première fois java [Introduction]
[Java8] Recherchez le répertoire et récupérez le fichier
[Java] Obtenez la date avec la classe LocalDateTime
Développement Android-Accès WEB (POST) Essayez de communiquer avec l'extérieur et d'envoyer des données. ~
Surveillez le conteneur Docker et le processus SystemD sur le même hôte avec Zabbix sur Ubuntu.
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Entrez à partir de docker-compose pour le moment et apprenez Docker tout en apprenant la conception de base du serveur Web (Nginx) ①
Vérifiez les options définies pour le processus Java en cours d'exécution
[Android] Obtenez la position tapée (coordonnées) sur l'écran
ChatWork4j pour l'utilisation de l'API ChatWork en Java
[Java] Réglez l'heure depuis le navigateur avec jsoup
JSON avec Java et Jackson Part 2 XSS mesures
Développement d'Android Studio pour la première fois (pour les débutants)
[Java] Obtenez des images avec l'API Google Custom Search
Installez Amazon Corretto (préversion) pour le moment
Compilez et exécutez Java sur la ligne de commande
Opérations de conteneur Docker avec l'API Docker-Client pour Java
[Développement Android] Obtenez des images du serveur avec Java et définissez-les dans ImageView! !!
Revenir au début et démarrer avec Java ① Types de données et modificateurs d'accès
Mémo à faire pour le moment lors de la construction de la série CentOS 6 avec VirtualBox
Rêver de créer facilement une API Web pour la base de données d'un système Java existant
[Android studio / Java] Ce que vous ne comprenez pas lorsque vous le touchez pour la première fois