簡體   English   中英

使用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:無法為方法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);

要訪問原始響應,請使用okhttp中的ResponseBody作為您的調用類型。

Call<ResponseBody> login(...)

在回調中,您可以使用響應的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();
    }
});

用於同步通話 -

Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());

您可以使用攔截器獲取有關標頭,響應代碼,原始json響應體的信息。 您可以編寫自定義攔截器,但我更喜歡使用Square自己的Logging Interceptor。 它可以在maven中心使用。

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上看到您的請求和響應。

我有同樣的問題,但有一個不同的解決方案。 我接受了請求並使用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());

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM