java - recyclerview - retrofit login example
retroadaptar 2.0 cómo imprimir la respuesta json completa? (10)
Me estoy moviendo de Volley a Retrofit actualmente la versión 2.0.
¿Cómo imprimir el código de respuesta json completo?
Incluye :
compile ''com.squareup.retrofit:converter-gson:2.0.0-beta2''
compile ''com.squareup.retrofit:retrofit:2.0.0-beta2''
RestClient :
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
return response;
}
});
Gson gson = new GsonBuilder()
.setDateFormat("yyyy''-''MM''-''dd''T''HH'':''mm'':''ss''.''SSS''Z''")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(ROOT)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
REST_CLIENT = retrofit.create(APIService.class);
APIService :
@GET("my/json")
Call<Model> getFeed();
En actividad - API de llamadas :
Call<Model> call = RestClient.get().getFeed();
call.enqueue(new Callback<Model>() {
@Override
public void onResponse(Response<Model> response, Retrofit retrofit) {
Log.w("2.0 getFeed > response.raw() => ", response.raw().toString());//DONT WORK
Log.w("2.0 getFeed > retrofit => ", retrofit.toString());//DONT WORK
Log.w("2.0 getFeed > body => ", response.body().toString()); //DONT WORK
Log.w("2.0 getFeed > getStatus => ", response.body().getStatus());
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
Log.e("2.0 getFeed > onFailure => ", t.toString());
}
});
Eche un vistazo al paquete okhttp3.logging, ya tienen HttpLoggingInterceptor que puede usar para sus necesidades. Y dependiendo de ellos también puede especificar el nivel de registro.
y puede incluir este interceptor a su solicitud, como se menciona, a través de OkHttpClient.Builder:
public OkHttpClient provideOkHttpClient() {
final OkHttpClient.Builder okHttpBuilder = new OkHttpClient.Builder();
okHttpBuilder.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
return okHttpBuilder.build();
}
En realidad Square ya crea una clase solo para esto, simplemente agrega
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor).build();
Y, en Retrofit
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl("https://yourapi.com/api/")
.build();
La clase de interceptor está en maven central
compile ''com.squareup.okhttp3:logging-interceptor:3.5.0''
Puede establecer el nivel de registro en la clase HttpLoggingInterceptor. BODY es el prolijo (imprime todo al Cuerpo). Hay más información disponible en OkHttp github
¡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.
Enchufa la siguiente clase de interceptor como esta
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new LoggingInterceptor());
////// Clase de interceptor
public static class LoggingInterceptor implements Interceptor {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Log.i("LoggingInterceptor","inside intercept callback");
Request request = chain.request();
long t1 = System.nanoTime();
String requestLog = String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers());
if(request.method().compareToIgnoreCase("post")==0){
requestLog ="/n"+requestLog+"/n"+bodyToString(request);
}
Log.d("TAG","request"+"/n"+requestLog);
com.squareup.okhttp.Response response = chain.proceed(request);
long t2 = System.nanoTime();
String responseLog = String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers());
String bodyString = response.body().string();
Log.d("TAG","response only"+"/n"+bodyString);
Log.d("TAG","response"+"/n"+responseLog+"/n"+bodyString);
return response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), bodyString))
.build();
}
public static String bodyToString(final Request request) {
try {
final Request copy = request.newBuilder().build();
final Buffer buffer = new Buffer();
copy.body().writeTo(buffer);
return buffer.readUtf8();
} catch (final IOException e) {
return "did not work";
}
}`
Para imprimir la respuesta completa en json:
Log.w("2.0 getFeed > Full json res wrapped in gson => ",new Gson().toJson(response));
Si desea tener una bonita función de impresión , use:
Log.w("2.0 getFeed > Full json res wrapped in pretty printed gson => ",new GsonBuilder().setPrettyPrinting().create().toJson(response));
Tenga en cuenta que esto imprime los datos deserializados (no la respuesta Raw como devuelta por el servidor). Para obtener la respuesta sin procesar, necesitaría tratar con HttpLoggingInterceptor
o tener su propia versión del interceptor. Otro enfoque para usar herramientas de debuf de http como Stetho
o Charles Web Debugging Proxy
.
Para obtener una respuesta completa en Json en retrofit2.3.0, utilice a continuación.
esto funciona para mi
call.enqueue(new Callback<someList>() {
@Override
public void onResponse(Call<someList> call, Response<someList> response) {
if (response.isSuccessful())
Log.e("Success", new Gson().toJson(response.body()));
else
Log.e("unSuccess", new Gson().toJson(response.errorBody()));
}
@Override
public void onFailure(Call<someList> call, Throwable t) {
Log.e("onFailure", t.toString());
}
});
Prueba esto !!
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
/** Handles Log */
retrofit.client().interceptors().add(new LoggingInterceptor());
mRestClient = retrofit.create(RestServices.class);
class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Logger.d(String.format("Sending request %s on %s%n%s",
request.url(), chain.connection(), request.headers()));
Response response = chain.proceed(request);
long t2 = System.nanoTime();
Logger.d(String.format("Received response for %s in %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
final String responseString = new String(response.body().bytes());
Logger.d("Response: " + responseString);
return response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), responseString))
.build();
}
Prueba esto :
Log.d("LOG","RESPONSE ==="+response.raw().toString());
Puede establecer el nivel de registro en su adaptador de actualización como se muestra a continuación, y ver la respuesta y otros datos como el encabezado, el código de respuesta vs.
setLogLevel(LogLevel.FULL)
Editar: Esto no funciona en Retrofit 2.0. Si usa 1.9, puede usar.
Call<Model> call = RestClient.get().getFeed();call.enqueue(new Callbstrong
textack<Model>() {
@Override
public void onResponse(Response<Model> response, Retrofit retrofit) {
//try this
Call<Model> call = response.body();
// this is enough for retrieve model
}
@Override
public void onFailure(Throwable t) {
t.printStackTrace();
og.e("2.0 getFeed > onFailure => ", t.toString());
}
});
public class HttpLoggingInterceptor {
HttpLoggingInterceptor provideHttpLoggingInterceptor(){
return new HttpLoggingInterceptor(message ->
Log.d("TAG", message)).setLevel(HttpLoggingInterceptor.Level.BODY);
}
}
public class OkHttpClient {
OkHttpClient provideOkHttpClient(@NonNull HttpLoggingInterceptor interceptor){
return new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
}
}