我的问题与Retrofit 2.0 beta 4 response get IllegalArgumentException非常相似,但其答案对我没有帮助。
我从Retrofit 1.9迁移到2.0.2。 我一旦启动就注册我的应用程序进行消息传递。
/**
* Synchronous method to register GCM Token on Backend Server
*
* @return true, in case of success response, false otherwise.
*/
public boolean registerGCMToken()
{
...
try
{
Call<Response> call = mService.registerGCMToken(sessionId, this.ADDITIONAL_QUERY);
final Response response = call.execute().body(); // <<< Error points here
final DefaultResponse defaultResponse = DefaultResponse.newInstance(response);
return defaultResponse.isSuccess();
}
catch (IOException ignored)
{
}
return false;
}
我的界面如下:
@GET("my/url")
Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
@QueryMap Map<String, String> additionalQuery);
启动应用后,我收到此错误:
java.lang.IllegalArgumentException:&#39; retrofit2.Response&#39;不是一个 有效的反应体型。你的意思是ResponseBody吗?
并指出我上面提到的那条线。
我的newInstance方法如下:
public static final DefaultResponse newInstance(final Response response)
{
final DefaultResponse defaultResponse = new DefaultResponse();
if (response != null)
{
defaultResponse.status = response.code();
}
return defaultResponse;
}
如您所见,我需要知道什么是HTTP状态代码。通过将Response
通用更改为ResponseBody
,我无法获取http状态代码。你的建议是什么?
答案 0 :(得分:5)
我从你建议的帖子中读到的答案是,而不是:
@GET("my/url")
Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
@QueryMap Map<String, String> additionalQuery);
尝试:
@GET("my/url")
Call<ResponseBody> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
@QueryMap Map<String, String> additionalQuery);
因为你在这里获得了ResponseBody而不是Response:
final Response response = call.execute().body();
就像他做的那样:How can I handle empty response body with Retrofit 2?