使用 Retrofit 获取原始 HTTP 响应
Get raw HTTP response with Retrofit
我想从我的 API REST 获取原始 http 响应。我试过这个界面:
@POST("/login")
@FormUrlEncoded
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass,
@Field("appName") String appName, @Field("appKey") String appKey);
但我得到:
java.lang.IllegalArgumentException: Unable to create call adapter for
retrofit.Call
for method Api.login
我这样创建Retrofit
:
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
要访问原始响应,请使用 okhttp 中的 ResponseBody
作为您的调用类型。
Call<ResponseBody> login(...)
在您的回调中,您可以使用响应的 code
方法检查响应代码。这适用于任何改造 2 return 类型,因为你的回调总是得到一个 Response
参数化与你的实际 return 类型。对于异步 --
Call<ResponseBody> myCall = myApi.login(...)
myCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
// access response code with response.code()
// access string of the response with response.body().string()
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
对于同步调用 --
Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
您可以使用 Interceptors 获取有关 headers 响应代码的信息,直至原始 json 响应 body。您可以编写自定义拦截器,但我更喜欢使用 Square 自己的日志拦截器。它在 maven central 上可用。
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
这是使用方法
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor).build();
日志记录级别 BODY 将打印 headers 到 body 响应。在你的 Retrofit
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("https://yourapi.com/api/")
.build();
现在,打开 Log Cat,您将看到原始 HTTP 响应。
注意!
不要忘记在生产中删除拦截器(或将日志记录级别更改为 NONE)!否则人们将能够在 Log Cat 上看到您的请求和响应。
我遇到了同样的问题,但解决方案不同。我接受了请求并使用 OkHttp3Client 发送它。像这样:
//raw text
Request request = call.clone().request();
OkHttpClient client = new OkHttpClient();
okhttp3.Response test = client.newCall(request).execute();
System.out.println(test.body().string());
我想从我的 API REST 获取原始 http 响应。我试过这个界面:
@POST("/login")
@FormUrlEncoded
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass,
@Field("appName") String appName, @Field("appKey") String appKey);
但我得到:
java.lang.IllegalArgumentException: Unable to create call adapter for retrofit.Call for method Api.login
我这样创建Retrofit
:
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
要访问原始响应,请使用 okhttp 中的 ResponseBody
作为您的调用类型。
Call<ResponseBody> login(...)
在您的回调中,您可以使用响应的 code
方法检查响应代码。这适用于任何改造 2 return 类型,因为你的回调总是得到一个 Response
参数化与你的实际 return 类型。对于异步 --
Call<ResponseBody> myCall = myApi.login(...)
myCall.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
// access response code with response.code()
// access string of the response with response.body().string()
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
}
});
对于同步调用 --
Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
您可以使用 Interceptors 获取有关 headers 响应代码的信息,直至原始 json 响应 body。您可以编写自定义拦截器,但我更喜欢使用 Square 自己的日志拦截器。它在 maven central 上可用。
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
这是使用方法
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor).build();
日志记录级别 BODY 将打印 headers 到 body 响应。在你的 Retrofit
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("https://yourapi.com/api/")
.build();
现在,打开 Log Cat,您将看到原始 HTTP 响应。
注意!
不要忘记在生产中删除拦截器(或将日志记录级别更改为 NONE)!否则人们将能够在 Log Cat 上看到您的请求和响应。
我遇到了同样的问题,但解决方案不同。我接受了请求并使用 OkHttp3Client 发送它。像这样:
//raw text
Request request = call.clone().request();
OkHttpClient client = new OkHttpClient();
okhttp3.Response test = client.newCall(request).execute();
System.out.println(test.body().string());