通过改造获取原始 HTTP 响应

2022-08-31 15:49:18

我想从我的 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:无法创建用于改造的调用适配器。调用方法 Api.login

我以这种方式创建:Retrofit

Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);

答案 1

要访问原始响应,请使用 from okhttp 作为调用类型。ResponseBody

Call<ResponseBody> login(...)

在回调中,您可以使用响应的方法检查响应代码。这适用于任何改造 2 返回类型,因为您的回调始终会获得一个参数化的实际返回类型。对于异步 --codeResponse

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());

答案 2

可以使用拦截器获取有关标头、响应代码到原始 json 响应正文的信息。你可以编写自定义拦截器,但我更喜欢使用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 会将标头打印到正文响应。在您的改造中

Retrofit retrofit = new Retrofit.Builder()
            .client(client)               
            .baseUrl("https://yourapi.com/api/")
            .build();

现在,打开 Log Cat,您将看到原始 HTTP 响应。

谨慎!

不要忘记在生产中删除拦截器(或将日志记录级别更改为 NONE)!否则,人们将能够在Log Cat上看到您的请求和响应。


推荐