一个简单的 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>>
,可以获得字符串数组。