Android Una semplice richiesta GET


Esempio

Mostreremo come effettuare una richiesta GET a un'API che risponde con un oggetto JSON o un array JSON . La prima cosa che dobbiamo fare è aggiungere le dipendenze Retrofit e GSON Converter al file gradle del nostro modulo.

Aggiungi le dipendenze per la libreria di aggiornamento come descritto nella sezione Note.

Esempio di oggetto JSON previsto:

{
    "deviceId": "56V56C14SF5B4SF",
    "name": "Steven",
    "eventCount": 0
}

Esempio di array JSON:

[
    {
        "deviceId": "56V56C14SF5B4SF",
        "name": "Steven",
        "eventCount": 0
    },
    {
        "deviceId": "35A80SF3QDV7M9F",
        "name": "John",
        "eventCount": 2
    }
]

Esempio di classe modello corrispondente:

public class Device
{
    @SerializedName("deviceId")
    public String id;

    @SerializedName("name")
    public String name;

    @SerializedName("eventCount")
    public int eventCount;
}

Le annotazioni @SerializedName qui provengono dalla libreria GSON e ci consentono di serialize e deserialize questa classe in JSON utilizzando come chiavi il nome serializzato. Ora possiamo costruire l'interfaccia per l'API che preleverà effettivamente i dati dal server.

public interface DeviceAPI
{
    @GET("device/{deviceId}")
    Call<Device> getDevice (@Path("deviceId") String deviceID);

    @GET("devices")
    Call<List<Device>> getDevices();
}

C'è molto da fare qui in uno spazio piuttosto compatto quindi cerchiamo di scomporlo:

  • L'annotazione @GET proviene da Retrofit e indica alla biblioteca che stiamo definendo una richiesta GET.
  • Il percorso tra parentesi è l'endpoint che la nostra richiesta GET dovrebbe colpire (imposteremo l'URL di base un po 'più tardi).
  • Le parentesi graffe ci consentono di sostituire parti del percorso in fase di esecuzione in modo da poter passare argomenti.
  • La funzione che stiamo definendo si chiama getDevice e prende l'id del dispositivo che vogliamo come argomento.
  • L'annotazione @PATH dice a Retrofit che questo argomento dovrebbe sostituire il segnaposto "deviceId" nel percorso.
  • La funzione restituisce un oggetto Call di tipo Device .

Creazione di una classe wrapper:

Ora faremo una piccola classe wrapper per la nostra API per mantenere il codice di inizializzazione di Retrofit avvolto bene.

public class DeviceAPIHelper
{
    public final DeviceAPI api;

    private DeviceAPIHelper ()
    {

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        api = retrofit.create(DeviceAPI.class);
    }
}

Questa classe crea un'istanza di GSON per essere in grado di analizzare la risposta JSON, crea un'istanza di Retrofit con il nostro URL di base e un GSONConverter e quindi crea un'istanza della nostra API.

Chiamando l'API:

// Getting a JSON object
Call<Device> callObject = api.getDevice(deviceID);
callObject.enqueue(new Callback<Response<Device>>()
{
    @Override
    public void onResponse (Call<Device> call, Response<Device> response)
    {
        if (response.isSuccessful()) 
        {
           Device device = response.body();
        }
    }

    @Override
    public void onFailure (Call<Device> call, Throwable t)
    {
        Log.e(TAG, t.getLocalizedMessage());
    }
});

// Getting a JSON array
Call<List<Device>> callArray = api.getDevices();
callArray.enqueue(new Callback<Response<List<Device>>()
{
    @Override
    public void onResponse (Call<List<Device>> call, Response<List<Device>> response)
    {
        if (response.isSuccessful()) 
        {
           List<Device> devices = response.body();
        }
    }

    @Override
    public void onFailure (Call<List<Device>> call, Throwable t)
    {
        Log.e(TAG, t.getLocalizedMessage());
    }
});

Questo utilizza la nostra interfaccia API per creare un oggetto Call<Device> e per creare una Call<List<Device>> rispettivamente. Chiamare l' enqueue dice a Retrofit di effettuare quella chiamata su un thread in background e restituire il risultato alla richiamata che stiamo creando qui.

Nota: l' analisi di un array JSON di oggetti primitivi (come String, Integer, Boolean e Double ) è simile all'analisi di un array JSON. Tuttavia, non hai bisogno della tua classe di modello. Ad esempio, è possibile ottenere la matrice di stringhe con il tipo di restituzione della chiamata come Call<List<String>> .