2015-06-11 50 views
22

Json Serileştirme için OkHttp İstemcisi ve Jackson ile Retrofit kullanıyorum ve yanıtın başlığını almak istiyorum.Yanıttan Başlarken (Güçlendirme/OkHttp İstemcisi)

OkClient 'u uzatabildiğimi ve bunu engelleyebileceğimi biliyorum. Ancak bu, seri hale getirme işleminin başlamasından önce gelir.

Temelde gereksinim duyduğum şey, başlığın seri hale getirilmiş Json Nesnesi ile birlikte elde edilmesidir. arayüzün geri arama asenkron sürümünü kullanıyorsanız

cevap

23

Recommended 1.9.0 ile

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

Sonra geri arama getHeaders()

adlı bir yöntem olan Response nesne

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

     } 

     @Override 
     public void failure(RetrofitError error) { 

     } 
    } 

alacak

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()); 
      } 
     } 

Retrofit 2.0'ın tümünün kullanımı için rface, bunu Call<T> ile yapabilirsiniz.

Güçlendirme 2.0'ın Rx desteği için, Recommended 2.0.0 yılında Observable<Result<T>>

+0

Eşzamanlı olarak almanın bir yolu var mı? – Sakiboy

+1

Retrofit 1.9.0 no'lu sürümde, Retrofit 2.0+ evet'te ('Call .execute()' kullanarak) – EpicPandaForce

+0

Bunu gözlenebilirler ile nasıl yapabilirim? – Lester

20

ile yapabilirsiniz, böyle başlık alabilirsiniz: Çok sizin gibi

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 
    } 
}); 
+0

tüm üstbilgileri arasında nasıl döngü yapabilirim? "set-cookie" anahtar olarak. – Prabs

+1

'List cookieList = headers.toMultimap(). Get (" set-cookie ");' foreach'ı kullanarak listeyi yineleme – Prabs

+0

Veya bunun gibi: headers.values ​​("Set-Cookie"). – Edi

1

Ben boyunca başlıklarını istedi yükün tarafı. Etag'a ulaşmam lazımdı. Bazı retro foo'ları alır, ama yapabilirsin. İşte yaptığım şey. Bu kirli bir örnek, bunu en iyi uygulamalar örneği olarak kabul etmeyin.

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);