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

Hes*_*sam 1 android retrofit2

我的问题非常类似于Retrofit 2.0 beta 4响应得到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;
    }
Run Code Online (Sandbox Code Playgroud)

我的界面如下:

    @GET("my/url")
    Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
                    @QueryMap Map<String, String> additionalQuery);
Run Code Online (Sandbox Code Playgroud)

一旦我启动应用程序,我收到此错误:

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

并指出我上面提到的那条线.

我的newInstance方法如下所示:

    public static final DefaultResponse newInstance(final Response response)
    {
        final DefaultResponse defaultResponse = new DefaultResponse();
        if (response != null)
        {
            defaultResponse.status = response.code();
        }

        return defaultResponse;
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要知道什么是HTTP状态代码.通过更改Response泛型ResponseBody我无法获取http状态代码.那么,你的建议是什么?谢谢

Sha*_*han 5

从你建议的帖子中读到答案时我得到的是,而不是这样:

@GET("my/url")
    Call<Response> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
                    @QueryMap Map<String, String> additionalQuery);
Run Code Online (Sandbox Code Playgroud)

试试:

@GET("my/url")
    Call<ResponseBody> registerGCMToken(@Header(Constant.HEADER_WILDCARD) String accessToken,
                    @QueryMap Map<String, String> additionalQuery);
Run Code Online (Sandbox Code Playgroud)

因为您在这里得到ResponseBody而不是Response:

        final Response response = call.execute().body();
Run Code Online (Sandbox Code Playgroud)

就像他做的那样:我如何使用Retrofit 2处理空响应体?