Подтвердить что ты не робот

Получите необработанный ответ HTTP с помощью дооснащения

Я хочу получить исходный HTTP-ответ от моего REST API. Я пробовал с этим интерфейсом:

@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: невозможно создать адаптер вызова для retrofit.Call     для метода Api.login

Я создаю Retrofit следующим образом:

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

Ответ 1

Чтобы получить доступ к необработанному ответу, используйте ResponseBody из okhttp в качестве вашего типа вызова.

Call<ResponseBody> login(...)

В своем обратном вызове вы можете проверить код ответа с помощью метода code ответа. Это относится к любому типу возвращаемого типа retrofit 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());

Ответ 2

Вы можете получить информацию о заголовках, коде ответа, вплоть до основного тела ответа json, используя Interceptors. Вы можете написать свои собственные перехватчики, но я предпочитаю использовать квадратный собственный перехватчик ведения журнала. Он доступен на центральном сервере 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.

Внимание!

Не забудьте удалить Interceptors (или изменить уровень ведения журнала до NONE) на производстве! В противном случае люди смогут увидеть ваш запрос и ответ на Log Cat.