هل Apache Commons HttpClient دعم GZIP؟
-
03-10-2019 - |
سؤال
هل تدعم مكتبة 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
كما هو الحال دائما.