java.lang.IllegalArgumentException:' retrofit2.Response'不是有效的响应正文类型。你的意思是ResponseBody?

时间:2016-05-25 06:36:44

标签: android retrofit2

我的问题与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状态代码。你的建议是什么?

1 个答案:

答案 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?