অ্যান্ড্রয়েড: এইচটিটিপি যোগাযোগের জন্য "স্বীকৃতি-এনকোডিং: জিজিপ" ব্যবহার করা উচিত


109

আমি JSON ডেটার জন্য অনুরোধ করা একটি ওয়েবসারকে HTTP যোগাযোগ করেছি। আমি এই ডেটা স্ট্রিমটি দিয়ে সংকুচিত করতে চাই Content-Encoding: gzip। আমি কি Accept-Encoding: gzipআমার এইচটিপিপিলেটতে সেট করতে পারি? gzipঅ্যানড্রয়েড রেফারেন্সগুলির জন্য অনুসন্ধান এইচটিটিপি সম্পর্কিত কোনও কিছুই দেখায় না, যেমন আপনি এখানে দেখতে পারেন ।


1
অ্যান্ড্রয়েড-ওয়েবআরকুয়েস্ট GZIP সমর্থন করে এবং স্বয়ংক্রিয়ভাবে সঙ্কুচিত প্রতিক্রিয়াগুলি যেমন: এর সাথে new WebRequest().get().to("http://www.example.com/").askForGzip(true).executeSync()। বিশেষত, পদ্ধতিটি পার্সরেসপনস (...) আপনি যা খুঁজছেন তা হওয়া উচিত।
কাওয়

উত্তর:


174

কোনও সংযোগটি জিজেপ এনকোডড ডেটা গ্রহণ করতে পারে তা নির্দেশ করার জন্য আপনার http শিরোনাম ব্যবহার করা উচিত, যেমন:

HttpUriRequest request = new HttpGet(url);
request.addHeader("Accept-Encoding", "gzip");
// ...
httpClient.execute(request);

সামগ্রী এনকোডিংয়ের জন্য প্রতিক্রিয়া পরীক্ষা করুন:

InputStream instream = response.getEntity().getContent();
Header contentEncoding = response.getFirstHeader("Content-Encoding");
if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) {
    instream = new GZIPInputStream(instream);
}

7
আমার প্রয়োজনীয় সমস্ত বিবরণ সহ এটি একটি দুর্দান্ত এবং খুব সহায়ক উত্তর। অনেক ধন্যবাদ. একটি মন্তব্য: addHeader এর পরিবর্তে আমি setHeader ব্যবহার করেছি। আমি যা বুঝতে পারি তা থেকে এটি বিদ্যমান "স্বীকৃতি-এনকোডিং" ওভাররাইট করে। সঠিক কোনটি সঠিক / তা নিশ্চিত নয়। এটির সঠিক মান রয়েছে কিনা তা নিশ্চিত করতে একটি বিদ্যমান শিরোনামটি ওভাররাইট করতে বা সমান্তরালে অন্যান্য স্বীকৃতি-এনকোডিং শিরোনাম থাকতে পারে এমন ক্ষেত্রে এটি যুক্ত করতে।
znq

আপনি কোথায় প্রবাহ রাখেন?
মিকি

7
এটি অনুরোধটি জিজপ করে না, এটি কেবলমাত্র সার্ভারকে জানিয়ে দেয় যে আপনি জিজিপ'র প্রতিক্রিয়া গ্রহণ করতে পারেন।
জেফ্রি ব্লাটম্যান

1
এটি পেতে এবং গুগল পরিষেবাগুলির জন্য দৌড়াতে যে কেউ অসুবিধে হচ্ছে তাদের জন্য এখানে দুটি সমস্যা রয়েছে যা আমাকে খুঁজে পেতে বেশ সময় নিয়েছিল: (১) কিছু গুগল পরিষেবাদি সত্যই সক্ষম gzipকরতে স্ট্রিংটি ধারণ করতে ক্লায়েন্ট কর্তৃক প্রদত্ত ইউজার এজেন্ট স্ট্রিংয়ের প্রয়োজন হয় really gzip সংক্ষেপণ। (2) মনে রাখবেন যে সার্ভার প্রতিক্রিয়া gzip নাও হতে পারে যদি এটি খুবই ছোট ...
Sven

আমার সমস্যাটি হ'ল gzip শিরোনামটি কোথাও দেখা যায়নি। আমি সার্ভারের সাইডে নেটওয়ার্কটি শুকানোর জন্য ওয়্যারশার্ক ব্যবহার করছি এবং আমি অ্যান্ড্রয়েডে যুক্ত হওয়া "জিজিপ" শিরোনামের কোনও সন্ধান পাই না ...
টেড

33

আপনি যদি API এর 8 স্তর বা তার বেশি ব্যবহার করে থাকেন তবে এখানে AndroidHttpClient রয়েছে

এটিতে সহায়ক পদ্ধতি রয়েছে:

public static InputStream getUngzippedContent (HttpEntity entity)

এবং

public static void modifyRequestToAcceptGzipResponse (HttpRequest request)

অনেক বেশি সংযোগ কোডের দিকে পরিচালিত করে:

AndroidHttpClient.modifyRequestToAcceptGzipResponse( request );
HttpResponse response = client.execute( request );
InputStream inputStream = AndroidHttpClient.getUngzippedContent( response.getEntity() );

স্ট্রিং হিসাবে মার্কজিপড স্ট্রিমটি পার্স করার জন্য আমার ইন্টিটি ইউটিস.টস্ট্রিং (এইচটিপিএন্টিটি) অনুলিপি করা দরকার
মার্কোস

1
অ্যান্ড্রয়েড এইচটিপিপ্লায়েন্টকে এপিআই লেভেল 22-এ অবমুক্ত করা হয়েছিল।
অ্যালেক্স কুচেরেঙ্কো

13

আমি মনে করি এই লিঙ্কে কোডের নমুনাটি আরও আকর্ষণীয়: ক্লায়েন্ট জিজেপকন্টেন্টকম্পেশন.জভা

তারা ব্যবহার করছেন HttpRequestInterceptor এবং HttpResponseInterceptor

অনুরোধের জন্য নমুনা:

        httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

            public void process(
                    final HttpRequest request,
                    final HttpContext context) throws HttpException, IOException {
                if (!request.containsHeader("Accept-Encoding")) {
                    request.addHeader("Accept-Encoding", "gzip");
                }
            }

        });

উত্তরের জন্য নমুনা:

        httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

            public void process(
                    final HttpResponse response,
                    final HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                Header ceheader = entity.getContentEncoding();
                if (ceheader != null) {
                    HeaderElement[] codecs = ceheader.getElements();
                    for (int i = 0; i < codecs.length; i++) {
                        if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                            response.setEntity(
                                    new GzipDecompressingEntity(response.getEntity()));
                            return;
                        }
                    }
                }
            }

        });

1
আপনি এটি আরও আকর্ষণীয় বলে মনে করেন এমন কোনও কারণ?
গৌরব আগরওয়াল

3
@ কোডিংক্রো আপনি যা খুঁজছেন তা এখানে: এই বিশেষ ক্ষেত্রে এইচটিটিপি ক্লায়েন্টকে দুটি প্রোটোকল ইন্টারসেপ্টর যুক্ত করে স্বচ্ছ বিষয়বস্তু GZIP সংক্ষেপণে সক্ষম করা হয়েছে: একটি অনুরোধ ইন্টারসেপ্টার যা সমস্ত বহির্গামী অনুরোধগুলিতে এবং একটি প্রতিক্রিয়াতে 'স্বীকৃতি-এনকোডিং: gzip' শিরোনাম যুক্ত করে সংক্রামক যা সংকোচকৃত সাজসজ্জার শ্রেণীর সাথে মোড়কের মাধ্যমে সঙ্কুচিত প্রতিক্রিয়া সত্তাকে স্বয়ংক্রিয়ভাবে প্রসারিত করে। প্রোটোকল ইন্টারসেপ্টরের ব্যবহার এইচটিপিপি্লিয়েন্ট ইন্টারফেসের গ্রাহকের কাছে সামগ্রী সংকোচনকে সম্পূর্ণ স্বচ্ছ করে তোলে।
ক্লজিয়ের


GzipDecompressingEntity android.jar (2.2)
imcaptor

1

আমি gzip ব্যবহার করেন নি, কিন্তু আমি অনুমান করা হবে যে আপনি আপনার থেকে ইনপুট স্ট্রিম ব্যবহার করা উচিত HttpURLConnectionবা HttpResponseযেমন GZIPInputStream, এবং কিছু নির্দিষ্ট অন্যান্য বর্গ।


HTTPURL সংযোগটি ডিফল্টভাবে জিজিপ চালু করে। আপনাকে কেবল এটি নিশ্চিত করতে হবে যে আপনার ওয়েব সার্ভারটি জিপিপ পৃষ্ঠাগুলি ফিরিয়ে দিতে পারে। বিকাশকারী.অ্যান্ড্রয়েড / রেফারেন্স / জাভা / নেট / এইচটিপিআরএল সংযোগ। html আমি পিপিএইচ থেকে ob_start ("ob_gzhandler") ব্যবহার করে জিজিপ পৃষ্ঠাগুলি ফিরিয়ে দিতে সক্ষম হয়েছি;
মেট্রিক 152

আপনার উত্তর না থাকলে উত্তর দেবেন না!
মার্টিন.মার্টিনসন

0

আমার ক্ষেত্রে এটি এমন ছিল:

URLConnection conn = ...;
InputStream instream = conn.getInputStream();
String encodingHeader = conn.getHeaderField("Content-Encoding");
if (encodingHeader != null && encodingHeader.toLowerCase().contains("gzip"))
{
    instream = new GZIPInputStream(instream);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.