如何在Retrofit中处理null参数值

时间:2016-04-14 22:12:34

标签: android retrofit retrofit2

我们正在从Apache的http客户端迁移到Retrofit,我们发现一些边缘情况,其中param值可以为null。

Apache用于拦截这些并将它们变成空字符串,但Retrofit会抛出IllegalArgumentException。

我们希望复制旧的行为,以便它不会在生产中导致任何意外问题。在ParameterHandler抛出异常之前,有没有办法让这些空值与空字符串交换?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

我的网络服务(Asp.Net WebAPI):

[Route("api/values/getoptional")]
public IHttpActionResult GetOptional(string id = null)
{
    var response = new
    {
        Code = 200,
        Message = id != null ? id : "Response Message"
    };
    return Ok(response);
}

Android客户端:

public interface WebAPIService {
    ...

    @GET("/api/values/getoptional")
    Call<JsonObject> getOptional(@Query("id") String id);
}

MainActivity.java:

...
Call<JsonObject> jsonObjectCall1 = service.getOptional("240780"); // or service.getOptional(null);
jsonObjectCall1.enqueue(new Callback<JsonObject>() {
    @Override
    public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
        Log.i(LOG_TAG, response.body().toString());
    }

    @Override
    public void onFailure(Call<JsonObject> call, Throwable t) {
        Log.e(LOG_TAG, t.toString());
    }
});
...

Logcat输出:

如果使用service.getOptional(null);

04-15 13:56:56.173 13484-13484/com.example.asyncretrofit I/AsyncRetrofit: {"Code":200,"Message":"Response Message"}

如果使用service.getOptional("240780");

04-15 13:57:56.378 13484-13484/com.example.asyncretrofit I/AsyncRetrofit: {"Code":200,"Message":"240780"}