with studio implementar example android json jackson retrofit okhttp

android - studio - Obtención del encabezado de la respuesta(Retrofit/OkHttp Client)



retrofit login android studio (3)

Estoy usando Retrofit con el Cliente OkHttp y Jackson para la serialización Json y quiero obtener el encabezado de la respuesta.

Sé que puedo extender el OkClient e interceptarlo. Pero esto viene antes de que comience el proceso de deserialización.

Lo que básicamente necesito es obtener el encabezado junto con el objeto Json deserializado.


Al igual que tú, quería que los encabezados estuvieran al lado de la carga útil. Necesitaba acceso al Etag. Se necesita algo de retro-foo, pero puedes hacerlo. Esto es lo que hice. Es una muestra sucia, así que no tome esto como una muestra de mejores prácticas.

public static RestAdapter.Builder getRestBuilder(Context context) { GsonBuilder gsonBuilder = GsonBuilderUtils.getBuilder(); Gson gson = gsonBuilder.create(); // ** // 1. create our own custom deserializer here // ** final MyGsonConverter gsonConverter = new MyGsonConverter(gson); OkHttpClient httpClient = MyPersonalOkHttpFactory.getInstance().getAuthHttpClient(context); httpClient.networkInterceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request originalRequest = chain.request(); Response response = chain.proceed(originalRequest); // ** // 2. add the headers from the Interceptor to our deserializer instance // ** gsonConverter.headers = response.headers(); return response; } }); RestAdapter.Builder builder = new RestAdapter.Builder() .setClient(new OkClient(httpClient)) .setEndpoint(Common.getApiOriginUrl()) .setConverter(gsonConverter); return builder; } private static class MyGsonConverter extends GsonConverter { private Headers headers; public MyGsonConverter(Gson gson) { super(gson); } @Override public Object fromBody(TypedInput body, Type type) throws ConversionException { Object obj = super.fromBody(body, type); // ** // 3. at this point, gson is called and you have access to headers // do whatever you want here. I just set it on the return object. // ** if (obj instanceof HeadersArrayList) { ((HeadersArrayList)obj).setHeaders(headers); } return obj; } } public class HeadersArrayList<K> extends ArrayList<K>{ private Headers headers; public Headers getHeaders() { return headers; } public void setHeaders(Headers headers) { this.headers = headers; } } // the retrofit api for reference @GET("/api/of/my/backend/{stuff}") HeadersArrayList<String> getSomething(@Path("stuff") String stuff);


Con Retrofit 1.9.0, si usa la versión asíncrona de Callback de la interfaz,

@GET("/user") void getUser(Callback<User> callback)

Entonces su devolución de llamada recibirá un objeto de Response

Callback<User> user = new Callback<User>() { @Override public void success(User user, Response response) { } @Override public void failure(RetrofitError error) { } }

Que tiene un método llamado getHeaders()

Callback<User> user = new Callback<User>() { @Override public void success(User user, Response response) { List<Header> headerList = response.getHeaders(); for(Header header : headerList) { Log.d(TAG, header.getName() + " " + header.getValue()); } }

Para la interfaz de Retrofit 2.0, puede hacer esto con Call<T> .

Para el soporte Rx de Retrofit 2.0, puede hacer esto con Observable<Result<T>>


En Retrofit 2.0.0, puede obtener un encabezado como este:

public interface Api { @GET("user") Call<User> getUser(); } Call<User> call = api.getUser(); call.enqueue(new Callback<User>() { @Override public void onResponse(Call<User> call, Response<User> response) { // get headers Headers headers = response.headers(); // get header value String cookie = response.headers().get("Set-Cookie"); // TODO } @Override public void onFailure(Call<User> call, Throwable t) { // TODO } });