改造 2.0 转换器 returns NULL
Retrofit 2.0 Convertor returns NULL
我使用 Retrofit 2.0.0-beta2.
我找到了 同步 转换 .errorBody 到对象的 example。
我需要异步实现。
这是我的 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." :))))))
*/
}
}
抱歉我的英语不好:)
在异步请求中成功returns一个字符串。但是,转换为 object 是 not 运行ning.
如何获取 object 而不是 null?
好的,所以您的问题出在以下代码行中:
System.out.println(response.errorBody().string());
如果您查看 com.squareapp.okhttp.ResponseBody 的源代码,您会发现对 string()
的调用会耗尽响应流。因此,下次您尝试解析响应主体时
Error 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();
我使用 Retrofit 2.0.0-beta2.
我找到了 同步 转换 .errorBody 到对象的 example。
我需要异步实现。
这是我的 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." :))))))
*/
}
}
抱歉我的英语不好:)
在异步请求中成功returns一个字符串。但是,转换为 object 是 not 运行ning.
如何获取 object 而不是 null?
好的,所以您的问题出在以下代码行中:
System.out.println(response.errorBody().string());
如果您查看 com.squareapp.okhttp.ResponseBody 的源代码,您会发现对 string()
的调用会耗尽响应流。因此,下次您尝试解析响应主体时
Error 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();