私はorg.apache.commons.httpclient.HttpClient
を使用しており、レスポンスエンコーディングを設定する必要があります(何らかの理由でサーバーがContent-Typeで不正なエンコーディングを返す)。私の方法は、生のバイトとして応答を取得し、希望のエンコーディングでString
に変換することです。私はこれを行ういくつかのより良い方法があるかどうか疑問に思っています(例えば、HttpClientの設定)。提案ありがとう。HttpClient 3.1でレスポンスエンコーディングを設定する
答えて
私は、HttpClient
3.x APIを使用した方が良い答えはないと思います。
HTTP 1.1仕様では、クライアントがレスポンスヘッダーに指定された文字セットを "必須"とし、文字セットが指定されていない場合はISO-8859-1を使用する必要があることを明確に示しています。 HttpClient
APIは、プログラマがHTTP仕様に準拠することを前提に設計されています。明らかに、準拠していないサーバーと話すことができるように、仕様のルールを破る必要があります。それにもかかわらず、これは、API設計者が明示的にサポートする必要があることを見出したユースケースではありません。
HttpClient
4.xを使用していた場合は、ResponseHandler
を作成して、本体をHttpEntity
に変換して、応答メッセージの想定文字セットを無視します。
いくつかの注意事項:
Serverは、データを提供していますので、適切な形式でそれを提供するために、サーバー次第です。したがって、レスポンスのエンコーディングはクライアントではなくサーバーによって設定されます。しかし、クライアントは、それがAccept and Accept-Charset経由たいどのような形式のサーバーに提案することができます:
Accept: text/plain Accept-Charset: utf-8
しかし、httpサーバは、通常のフォーマット間の変換しません。
オプション1が機能しない場合は、サーバーの構成を確認する必要があります。
文字列が生のバイトとして送信されるとき(それは常にネットワークが送信するものなので)、常にエンコードが定義されます。サーバはこの生のバイトを生成するので、エンコーディングを定義します。だから、生のバイトを取ることはできず、選択したエンコーディングを使ってStringを作成することはできません。 StringからByteに変換するときに使用されたエンコーディングを使用する必要があります。
免責事項:私は実際にはAPIを読んでいるだけで、HttpClientを知りません。
私はHttpResponseを返すexecuteメソッドを使用し、次に.getEntity().getContent()
を使用します。これは純粋なバイトストリームなので、サーバーから渡されたエンコーディングを無視する場合は、単純に独自のInputStreamReaderをラップすることができます。オーケー
は、私が間違ったバージョンを持っていたように(当然、そこにあまりにも多くのHttpClient
のクラスがあります)になります。
これまでと同じように、他のクラスにある:HttpMethod
にはgetResponseBodyAsStream()
メソッドがあり、その周りに独自のInputStreamReaderをラップすることができます。あなたが書いたように、それが大きすぎるといけない場合は、一度に配列全体を取得し、文字列に変換してください。
私は応答を変更し、HttpClientを分析することが正しい方法ではないと思う。
サーバー管理者/ webmasterに間違った文字セットについてのメッセージを送信することをお勧めします。
挨拶の人々、誰かがUTF-8で書くことのHttpClientを設定するためのグーグル、この記事を見つけた場合には
強行。ベスト
このコード行は便利でなければなりません...
response.setContentType("text/html; charset=UTF-8");
こんにちは、コメントありがとうございます。どのようなオブジェクト 'レスポンス 'がどこにあるのかを明確にした完全なソースを投稿してください。 –
ご挨拶、ありがとう!私はHttpServletResponseの応答を言うのに十分であるべきだと思います。 – HommeDeJava
こんにちは、Apache HttpClientを使ってデータをダウンロードしています。私は 'Servlet'で作業していないので、' HttpServletResponse'はありません。 –
- 1. HttpClient 4.0でHttpParamsオブジェクトを設定する
- 2. のApacheのHttpClient 3.1ソケットタイムアウト
- 3. Spring 3.1のJava設定でspring-data-mongodbリポジトリを設定する
- 4. Glassfish 3.1ロードバランシング設定
- 5. httpタイムアウトをjakarta HttpClientに設定する
- 6. httpClientをjsoupに設定する方法
- 7. Apache HttpClient 4.1 - プロキシ設定
- 8. Redisでsymfony 3.1キャッシュコンポーネントを設定
- 9. Hibernate 4 + Spring 3.1設定オブジェクト
- 10. SOAPレスポンスエンコーディングの問題
- 11. 設定範囲ヘッダーへ*/* HttpClientを
- 12. Unityコンテナ経由でHttpClientを設定するには?
- 13. httpclientで要求ホスト名を設定する方法
- 14. .Net HttpClientで 'リクエストごと'のCookieを設定する
- 15. HttpClient個々のGetMethodで接続タイムアウトを設定する方法
- 16. Spring 3.1でJDOを設定するには?
- 17. Javaドライバ3.1とCassandraでカスタムペイロードオプションを使用するページ設定
- 18. HttpClientを短すぎるタイムアウトに設定するプロセス
- 19. Spring MVCレスポンスエンコーディングの問題
- 20. のApacheのHttpClientにカスタムファイル名の設定
- 21. HttpClient - 指紋と_csrfの設定方法?
- 22. CXF 3.1.XはApache HttpComponents-HttpClientを使用していますか?
- 23. BrowserMob。 httpClientを通じてBrowserMobProxyを設定する方法
- 24. Apache HttpClient 4.3 - 接続アイドルタイムアウトを設定する
- 25. C#HttpClientキープアライブをfalseに設定する方法
- 26. SWTブラウザとJetty HttpClientに同じCookieStoreを設定する方法
- 27. 初期化後にHttpMessageHandlerをHttpClientのインスタンスに設定する
- 28. symfonyの3.1 PSR-6のキャッシュ設定
- 29. Javaスクリプトの書式設定Railsは3.1
- 30. httpclientの(3.1)URIUtil.encodeQuery()はorg.apache.httpcomponents(4.4.1)にあります。
こんにちは、私は自分のコントロール下のサーバーを持っていない、それはContent-Typeの属性( 'のHttpClientで間違ったencondingを返します。 getResponseBodyAsString() 'は応答ヘッダーのContent-Type属性からエンコーディングを受け取ります)。私はセットアップのAcceptとAccept-Charsetを試しましたが、要求ヘッダーで言及していますが、それは私を助けません。わかりやすく、それはサーバー上で何かが間違っていますが、私は所有者ではないので、変更はできません。 –
あなたは運がありません。 –
+1すばらしいコメント:-D –