java - example - Obtenga una respuesta HTTP sin procesar con Retrofit
retrofit vs volley (3)
Quiero obtener la respuesta HTTP sin formato de mi API REST. Lo he intentado con esta interfaz:
@POST("/login")
@FormUrlEncoded
Call<retrofit.Response> login(@Field("username") String login, @Field("password") String pass,
@Field("appName") String appName, @Field("appKey") String appKey);
Pero entiendo:
java.lang.IllegalArgumentException: no se puede crear el adaptador de llamada para la actualización. Llamar al método Api.login
Creo Retrofit
esta manera:
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
retrofitBuilder.addConverterFactory(JacksonConverterFactory.create());
Retrofit retrofitAdapter = retrofitBuilder.baseUrl(baseUrl).build();
return retrofitAdapter.create(apiClass);
Para obtener acceso a la respuesta sin formato, use ResponseBody
de okhttp como su tipo de llamada.
Call<ResponseBody> login(...)
En su devolución de llamada, puede verificar el código de respuesta con el método de code
de la respuesta. Esto se aplica a cualquier tipo de devolución de retroadaptación 2, porque su devolución de llamada siempre obtiene una Response
parametrizada con su tipo de devolución real. Para asíncrono
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();
}
});
para llamadas sincrónicas -
Response<ResponseBody> response = myCall.execute();
System.out.println("response code" + response.code());
Puede obtener información sobre encabezados, código de respuesta, hasta el cuerpo de respuesta raw json mediante el uso de Interceptors . Puede escribir sus Interceptores personalizados, pero prefiero usar el Interceptor de registro propio de Square. Está disponible en maven central.
compile ''com.squareup.okhttp3:logging-interceptor:3.5.0''
He aquí cómo usarlo
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor).build();
Nivel de registro BODY imprimirá encabezados a la respuesta del cuerpo. Y en su Retrofit
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("https://yourapi.com/api/")
.build();
Ahora, abra Log Cat y verá la respuesta HTTP sin formato.
¡Precaución!
¡No olvide eliminar Interceptores (o cambie el Nivel de registro a NINGUNO) en producción! De lo contrario, las personas podrán ver su solicitud y respuesta en Log Cat.
Tuve el mismo problema pero una solución diferente. Tomé la solicitud y la envié con OkHttp3Client. Me gusta esto:
//raw text
Request request = call.clone().request();
OkHttpClient client = new OkHttpClient();
okhttp3.Response test = client.newCall(request).execute();
System.out.println(test.body().string());