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