android - Retrofit 2.0 转换器返回 NULL

标签 android json asynchronous callback retrofit

我使用Retrofit 2.0.0-beta2

我找到了一个 example对象的同步转换.errorBody

我需要异步实现它。

这是我的 json:

{
  "error_msg": "This user name is already registered."
}

运行异步示例时,我得到null

package com.test.client;

import com.squareup.okhttp.ResponseBody;

import java.io.IOException;
import java.lang.annotation.Annotation;

import retrofit.Call;
import retrofit.Callback;
import retrofit.Converter;
import retrofit.GsonConverterFactory;
import retrofit.Response;
import retrofit.Retrofit;
import retrofit.http.GET;

public final class DeserializeErrorBody {

interface Service {
    @GET("account.signup")
    Call<User> getUser();
}

static class User {
    // normal fields...
}

static class Error {
    String error_msg;
}

public static void main(String... args) throws IOException {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.site.com/method/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    Service service = retrofit.create(Service.class);


    // ASYNCHRONOUS

    Call<User> response = service.getUser();
    response.enqueue(new Callback<User>() {

        @Override
        public void onResponse(Response<User> response, Retrofit retrofit) {
            if(!responce.isSuccess()) {

                System.out.println(response.errorBody().string()); // returns { "error_msg": "This user name is already registered."}    :)))))

                Converter<ResponseBody, Error> errorConverter = retrofit.responseConverter(Error.class, new Annotation[0]);

                try {
                    Error error = errorConverter.convert(response.errorBody());

                    System.out.println(error); // returns null   :((((((

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        @Override
        public void onFailure(Throwable t) {
            // ...
        }
    });


    // SYNCHRONOUS

    /*
    Response<User> call = service.getUser().execute();
    Converter<ResponseBody, Error> errorConverter = retrofit.responseConverter(Error.class, new Annotation[0]);

    Error error = errorConverter.convert(call.errorBody());
    System.out.println(error); // returns Object     :))))))
    System.out.println(error.error_msg); // returns "This user name is already registered."    :))))))
    */

}
}

抱歉我的英语不好:)

在异步请求中成功返回一个字符串。但是,对象 的转换正在运行。

如何获取对象而不是null

最佳答案

好的,所以您的问题出在以下代码行中:

System.out.println(response.errorBody().string());

如果您查看 com.squareapp.okhttp.ResponseBody 的来源您会发现对 string() 的调用将耗尽响应流。因此,下次您尝试解析响应主体时

错误error = errorConverter.convert(response.errorBody());

调用 errorBody() 不会给出字节流,Gson 也不会解析任何数据。

那么你应该尝试什么?只是不要像您那样使用 errorBody() 。只需删除这一行:

System.out.println(response.errorBody().string());

如果您需要高级日志记录 follow link .这基本上应该是这样的:

OkHttpClient client = new OkHttpClient();
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);
client.interceptors().add(logging);

Retrofit retrofit = new Retrofit.Builder()
       .baseUrl("https://api.site.com/method/")
       .addConverterFactory(GsonConverterFactory.create())
       .client(client)
       .build();

关于android - Retrofit 2.0 转换器返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32997062/

相关文章:

android - 如何在同一网络上以编程方式获取其他支持 Wifi 的设备的 IP 地址?

android - 如何使用 ARCore(原生 Android)显示/渲染 2D 图像

android - 无法将任务 'wrapper' 添加为具有该名称的任务已存在

c# - 如何在 MonoTouch 中使用 System.Json 进行序列化

arrays - PostgreSQL 中 json 数组值的交集

javascript - 使用jquery异步上传文件的操作

c# - 任务未等待完成

javascript - 在 setTimeout 之前和之后使用异步函数调用开 Jest

android - 如何在多台计算机上使用 google maps API 开发 Android 应用程序?

javascript - JSON.parse 错误地解析/转换大数字