一個簡單的 GET 請求

我們將展示如何向使用 JSON 物件或 JSON 陣列響應的 API 發出 GET 請求。我們需要做的第一件事是將 Retrofit 和 GSON Converter 依賴項新增到我們模組的 gradle 檔案中。

按照備註部分中的說明新增改造庫的依賴項。

預期的 JSON 物件的示例:

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

JSON 陣列的示例:

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

相應模型類的示例:

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

    @SerializedName("name")
    public String name;

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

**** 這裡@SerializedName 註釋來自 GSON 庫,允許我們使用序列化名稱作為鍵,將此類提供給 serializeJSON。現在我們可以構建實際從伺服器獲取資料的 API 介面。

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

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

在一個相當緊湊的空間裡有很多事情要做,所以讓我們分解一下:

  • @GET 註釋來自 Retrofit 並告訴庫我們正在定義一個 GET 請求。
  • 括號中的路徑是我們的 GET 請求應該命中的端點(稍後我們將設定基本 URL)。
  • 花括號允許我們在執行時替換部分路徑,以便我們可以傳遞引數。
  • 我們定義的函式叫做 getDevice,並將我們想要的裝置 ID 作為引數。
  • @PATH 註釋告訴 Retrofit 這個引數應該替換路徑中的 deviceId 佔位符。
  • 該函式返回 Device 型別的 Call 物件。

建立包裝類:

現在我們將為我們的 API 建立一個小包裝類,以便很好地保持 Retrofit 初始化程式碼。

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

此類建立一個 GSON 例項,以便能夠解析 JSON 響應,使用我們的基本 URL 和 GSONConverter 建立一個 Retrofit 例項,然後建立一個 API 例項。

呼叫 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());
    }
});

這使用我們的 API 介面來建立 Call<Device> 物件並分別建立 Call<List<Device>>。呼叫 enqueue 告訴 Retrofit 在後臺執行緒上進行呼叫,並將結果返回給我們在這裡建立的回撥。

注意: 解析 JSON 陣列的原始物件(如 String,Integer,BooleanDouble )類似於解析 JSON 陣列。但是,你不需要自己的模型類。例如,通過將呼叫的返回型別設定為 Call<List<String>>,可以獲得字串陣列。