2016-05-19 5 views
5

मैं एक सर्वर प्रतिक्रिया को संसाधित करने की कोशिश कर रहा हूं जो GZIP'd है। प्रतिक्रिया एक हैडररेट्रोफिट: सामग्री-एन्कोडिंग के बिना GZIP'd प्रतिक्रिया को कैसे पार्स करें: gzip header

Content-Type: application/x-gzip 

के साथ आता है, लेकिन मैं एक प्रॉक्सी का उपयोग कि शीर्ष लेख जोड़ने के लिए, प्रतिक्रिया ठीक पार्स हो जाता है तो हैडर

Content-Encoding: gzip 

जरूरत नहीं है। मेरे पास सर्वर पर कोई नियंत्रण नहीं है, इसलिए मैं हेडर नहीं जोड़ सकता।

क्या मैं रेट्रोफिट को जीजेआईपी सामग्री के रूप में पेश करने के लिए मजबूर कर सकता हूं? क्या कोई बेहतर तरीका है? सर्वर के लिए यूआरएल है: http://crowdtorch.cms.s3.amazonaws.com/4474/Updates/update-1.xml

उत्तर

1

तुलना में एक बेहतर तरीका नहीं है पहिया बदलते। बस Content-Encoding हेडर स्वयं जोड़ें।

.addNetworkInterceptor((Interceptor.Chain chain) -> { 
    Request req = chain.request(); 
    Headers.Builder headersBuilder = req.headers().newBuilder(); 

    String credential = Credentials.basic(...); 
    headersBuilder.set("Authorization", credential); 

    Response res = chain.proceed(req.newBuilder().headers(headersBuilder.build()).build()); 

    return res.newBuilder() 
     .header("Content-Encoding", "gzip") 
     .header("Content-Type", ""application/json") 
     .build(); 
}) 

वास्तव में, अपने कोड आंतरिक कोड (जैसे JDK से com.sun संकुल) का उपयोग कर की बुराइयों का एक उत्कृष्ट उदाहरण है। RealResponseBody में अब वह कन्स्ट्रक्टर नहीं है।

+0

दिलचस्प। एक इंटरसेप्टर का प्रयोग करें। अच्छा विचार। लगता है जैसे इसे काम करना चाहिए। – itsymbal

+0

@itsymbal यह करता है, मैं इसका उपयोग करता हूं –

6

मैंने इसे समझ लिया। विचार एक कस्टम इंटरसेप्टर जोड़ने के लिए है जो अभी तक अनजान प्रतिक्रिया नहीं लेगा, और इसे 'मैन्युअल रूप से अनजिप करें' - वही काम करें जो ओकेएचटीपी स्वचालित रूप से सामग्री-एन्कोडिंग हेडर पर आधारित होगा, लेकिन उस शीर्षलेख की आवश्यकता के बिना।

जिले की तरह है:

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder() 
      .addInterceptor(new UnzippingInterceptor()); 
    OkHttpClient client = clientBuilder.build(); 

और इंटरसेप्टर जिले की तरह है:

private class UnzippingInterceptor implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Response response = chain.proceed(chain.request()); 
     return unzip(response); 
    } 
} 

और unzip समारोह जिले की तरह है:

// copied from okhttp3.internal.http.HttpEngine (because is private) 
private Response unzip(final Response response) throws IOException { 

    if (response.body() == null) { 
     return response; 
    } 

    GzipSource responseBody = new GzipSource(response.body().source()); 
    Headers strippedHeaders = response.headers().newBuilder() 
      .removeAll("Content-Encoding") 
      .removeAll("Content-Length") 
      .build(); 
    return response.newBuilder() 
      .headers(strippedHeaders) 
      .body(new RealResponseBody(strippedHeaders, Okio.buffer(responseBody))) 
      .build(); 
} 
संबंधित मुद्दे