一個簡單的 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
庫,允許我們使用序列化名稱作為鍵,將此類提供給 serialize
和 JSON
。現在我們可以構建實際從伺服器獲取資料的 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,Boolean 和 Double )類似於解析 JSON 陣列。但是,你不需要自己的模型類。例如,通過將呼叫的返回型別設定為 Call<List<String>>
,可以獲得字串陣列。