سؤال

هل تدعم مكتبة Apache Commons HttpClient GZIP؟ أردنا استخدام تمكين ضغط GZIP على خادم Apache الخاص بنا لتسريع اتصالات العميل/الخادم (لدينا صفحة PHP تسمح لتطبيق Android الخاص بنا بمزامنة الملفات مع الخادم).

هل كانت مفيدة؟

المحلول

يدعم Apache HTTPClient 4.1 ضغط المحتوى خارج الصندوق إلى جانب العديد من الميزات الأخرى التي تم النظر فيها سابقًا خارج النطاق.

نصائح أخرى

إذا كان الخادم الخاص بك قادرًا على توفير محتوى Gzipped ، مع Apache HTTP Client 4.1 كل ما تحتاجه هو الاستخدام

org.apache.http.impl.client.ContentEncodingHttpClient

وهي فئة فرعية من DefaultHttpClient.

سيضيف هذا العميل أيضًا رؤوسًا تقول إنها تقبل محتوى Gzipped.

ليس له أي دعم لهذا خارج الصندوق ، ويبدو أنه من غير المحتمل أن تتم إضافته إلى HTTPCLIENT هنا). ومع ذلك ، يمكنك القيام بذلك عن طريق إضافة قراء طلب مخصص ومناولة دفق الطلب/الاستجابة اليدوي ، على رأس المكتبة الأساسية ، لكنها غريبة.

يبدو أنه يمكنك القيام بذلك مع httpclient 4 ، ولكن ليس بدون بعض الجهد.

رديئة جدا ، إذا سألتني ، هذه الأشياء يجب أن تكون أسهل مما هي عليه.

منذ 4.1 ، يتولى Apache HTTPClients طلب الطلب وضغط الاستجابة.

  • لا تحتاج إلى ضغط الطلب ، ولا حاجة لتعيين أي "تقبل" في رؤوس الطلب.
  • إنه يتعامل تلقائيًا مع إلغاء الضغط الاستجابة أيضًا ، لا حاجة للتعامل مع فك ضغط الاستجابة.
  • حتى 4.3 يتولى gzip وانحراف. يمكنك التحقق ResponseContentEncoding API Doc هنا.

فقط استخدم:

HttpClients.custom()

الذي يستخدم:

HttpClientBuilder.create()

إذا كنت ترغب في تسجيل الوصول في مكتبة GOTO HttpClientBuilder يستخدم RequestAcceptEncoding & ResponseContentEncoding

يمكنك تعطيله من خلال "DisableContentCompression ()"

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .disableContentCompression() //this disables compression
                .build();

يرجى التأكد إذا قمت بإضافة أي اعتراض ، فيمكنه تجاوز ذلك ، استخدمه بعناية.

HttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .setHttpProcessor(httpprocessor) //this interceptor can override your compression.
                .build();

فيما يلي نموذج رمز Scala الذي يستخدم مكتبة Java Apache-HTTP-Client

 def createCloseableHttpClient(): CloseableHttpClient = {
    val builder: HttpClientBuilder = HttpClientBuilder.create
    val closableClient = builder.build()
    closableClient
  }

  def postData(data: String): Unit = {
    val entity = EntityBuilder.create()
      .setText(data)
      .setContentType(ContentType.TEXT_PLAIN)
      .gzipCompress()
      .build()
    val post = new HttpPost(postURL + endPoint)
    post.setEntity(entity)
    post.setHeader("Content-Type", "application/gzip")
    val client = createCloseableHttpClient()
    client.execute(post)
    client.close()
  }

اعتراضات بروتوكول مخصصة قد تساعد كذلك.

إخلاء المسئولية: لم أحاول هذا بعد.

إنه لا يدعمه خارج الصندوق ولكن يمكنك تحويل كيان الإرجاع HttpResponse في واحد غير مضغوط عن طريق الاتصال

val entity = new GzipDecompressingEntity(response.getEntity)

ثم تابع entity.getContent كما هو الحال دائما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top