如何使用 retrofit2 (v2.0.0-beta3) 处理响应
how to handle response with retrofit2 (v2.0.0-beta3)
我正在使用最新版本的 retrofit,retrofit2,v2.0.0-beta3。 API 响应是用户 object 或空响应(空值)。如果我发送正确的 username/password,则句柄进入 onResponse 方法,用户 object 成功。但是,如果发送错误的密码,那么 API 将 return 什么都没有,只有很少的响应值 headers。但是我在 onFailure(Throwable) 中收到 MalformedJsonException。
"com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $"
这里是错误截图,
我认为应该有某种方法可以使用 ResponseInceptor 或 Custom CallBack 来处理空响应和读取响应 headers。但不知道如何使用它。
这是代码,
// Define the interceptor, add authentication headers
Interceptor interceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder().addHeader("Authorization", new ITAuthorizationUtil().getAuthorization(user.getMobile_no(), user.getPassword())).build();
return chain.proceed(newRequest);
}
};
// Add the interceptor to OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
ITAPIEndpointsInterface apiEndpointsInterface = retrofit.create(ITAPIEndpointsInterface.class);
///
Call<User> call = apiEndpointsInterface.userLogin(senderId, applicationId, registrationId);
//asynchronous call
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response) {
ApiResponse apiResponse = ITAPIStatusInfo.getApiErrorObject_Retrofit(response.headers());
onSuccess( response.body(),apiResponse);
}
@Override
public void onFailure(Throwable t) {
Log.d(">>> ",t.getMessage());
}
});
您需要为 Retrofit 提供一个 GSON 实例。
尝试:
Gson gson = new GsonBuilder().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
您是否已将“com.squareup.retrofit2:converter-gson:2.0.0-beta3”添加到 gradle 依赖项?
你可以像这样创建一个 Retrofit 实例:
private static MyClient MyClient;
public static String baseUrl = "http://mybaseurl.com" ;
public static MyClient getClient() {
if (MyClient == null) {
OkHttpClient httpClient = new OkHttpClient();
Retrofit client = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MyClient = client.create(MyClient.class);
}
return MyClient;
}
而对于 headers,另一种添加方式是这样 "Authorization" header 您正在添加,它只是在您的 api 端点接口中添加一个注释为需要 header 的 API 调用调用了 @Header
示例:
@POST("/login/")
Call<Farm> login(@Header("Authorization") String token, @Body User user);
我正在使用最新版本的 retrofit,retrofit2,v2.0.0-beta3。 API 响应是用户 object 或空响应(空值)。如果我发送正确的 username/password,则句柄进入 onResponse 方法,用户 object 成功。但是,如果发送错误的密码,那么 API 将 return 什么都没有,只有很少的响应值 headers。但是我在 onFailure(Throwable) 中收到 MalformedJsonException。
"com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $"
这里是错误截图,
我认为应该有某种方法可以使用 ResponseInceptor 或 Custom CallBack 来处理空响应和读取响应 headers。但不知道如何使用它。
这是代码,
// Define the interceptor, add authentication headers
Interceptor interceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request newRequest = chain.request().newBuilder().addHeader("Authorization", new ITAuthorizationUtil().getAuthorization(user.getMobile_no(), user.getPassword())).build();
return chain.proceed(newRequest);
}
};
// Add the interceptor to OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
ITAPIEndpointsInterface apiEndpointsInterface = retrofit.create(ITAPIEndpointsInterface.class);
///
Call<User> call = apiEndpointsInterface.userLogin(senderId, applicationId, registrationId);
//asynchronous call
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Response<User> response) {
ApiResponse apiResponse = ITAPIStatusInfo.getApiErrorObject_Retrofit(response.headers());
onSuccess( response.body(),apiResponse);
}
@Override
public void onFailure(Throwable t) {
Log.d(">>> ",t.getMessage());
}
});
您需要为 Retrofit 提供一个 GSON 实例。
尝试:
Gson gson = new GsonBuilder().create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
您是否已将“com.squareup.retrofit2:converter-gson:2.0.0-beta3”添加到 gradle 依赖项?
你可以像这样创建一个 Retrofit 实例:
private static MyClient MyClient;
public static String baseUrl = "http://mybaseurl.com" ;
public static MyClient getClient() {
if (MyClient == null) {
OkHttpClient httpClient = new OkHttpClient();
Retrofit client = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
MyClient = client.create(MyClient.class);
}
return MyClient;
}
而对于 headers,另一种添加方式是这样 "Authorization" header 您正在添加,它只是在您的 api 端点接口中添加一个注释为需要 header 的 API 调用调用了 @Header
示例:
@POST("/login/")
Call<Farm> login(@Header("Authorization") String token, @Body User user);