使用Retrofit获取原始HTTP响应

Héc*_*tor 47 java jackson 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);
Run Code Online (Sandbox Code Playgroud)

但我得到:

java.lang.IllegalArgumentException:无法为方法Api.login的retrofit.Call创建调用适配器

我这样创造Retrofit:

Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
Run Code Online (Sandbox Code Playgroud)

iag*_*een 75

要访问原始响应,请使用ResponseBodyokhttp作为您的呼叫类型.

Call<ResponseBody> login(...)
Run Code Online (Sandbox Code Playgroud)

在回调中,您可以使用响应code方法检查响应代码.这适用于任何改进2返回类型,因为您的回调总是Response使用您的实际返回类型进行参数化.对于异步 -

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();
    }
});
Run Code Online (Sandbox Code Playgroud)

用于同步通话 -

Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
Run Code Online (Sandbox Code Playgroud)


ald*_*dok 33

您可以使用拦截器获取有关标头,响应代码,原始json响应体的信息.您可以编写自定义拦截器,但我更喜欢使用Square自己的Logging Interceptor.它可以在maven中心使用.

compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
Run Code Online (Sandbox Code Playgroud)

这是如何使用它

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor).build();
Run Code Online (Sandbox Code Playgroud)

记录级别BODY将标题打印到正文响应.在你的改造中

Retrofit retrofit = new Retrofit.Builder()
            .client(client)               
            .baseUrl("https://yourapi.com/api/")
            .build();
Run Code Online (Sandbox Code Playgroud)

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

警告!

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


Rob*_*son 6

我有同样的问题,但有不同的解决方案。我接受了请求并使用 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());
Run Code Online (Sandbox Code Playgroud)

来源: http: //robinhenniges.com/de/retrofit-2-raw-response