2011-02-28 13 views
3

私はorg.apache.commons.httpclient.HttpClientを使用しており、レスポンスエンコーディングを設定する必要があります(何らかの理由でサーバーがContent-Typeで不正なエンコーディングを返す)。私の方法は、生のバイトとして応答を取得し、希望のエンコーディングでStringに変換することです。私はこれを行ういくつかのより良い方法があるかどうか疑問に思っています(例えば、HttpClientの設定)。提案ありがとう。HttpClient 3.1でレスポンスエンコーディングを設定する

答えて

3

私は、HttpClient 3.x APIを使用した方が良い答えはないと思います。

HTTP 1.1仕様では、クライアントがレスポンスヘッダーに指定された文字セットを "必須"とし、文字セットが指定されていない場合はISO-8859-1を使用する必要があることを明確に示しています。 HttpClient APIは、プログラマがHTTP仕様に準拠することを前提に設計されています。明らかに、準拠していないサーバーと話すことができるように、仕様のルールを破る必要があります。それにもかかわらず、これは、API設計者が明示的にサポートする必要があることを見出したユースケースではありません。

HttpClient 4.xを使用していた場合は、ResponseHandlerを作成して、本体をHttpEntityに変換して、応答メッセージの想定文字セットを無視します。

2

いくつかの注意事項:

  1. Serverは、データを提供していますので、適切な形式でそれを提供するために、サーバー次第です。したがって、レスポンスのエンコーディングはクライアントではなくサーバーによって設定されます。しかし、クライアントは、それがAccept and Accept-Charset経由たいどのような形式のサーバーに提案することができます:

    Accept: text/plain 
    Accept-Charset: utf-8 
    

    しかし、httpサーバは、通常のフォーマット間の変換しません。

  2. オプション1が機能しない場合は、サーバーの構成を確認する必要があります。

  3. 文字列が生のバイトとして送信されるとき(それは常にネットワークが送信するものなので)、常にエンコードが定義されます。サーバはこの生のバイトを生成するので、エンコーディングを定義します。だから、生のバイトを取ることはできず、選択したエンコーディングを使ってStringを作成することはできません。 StringからByteに変換するときに使用されたエンコーディングを使用する必要があります。

+0

こんにちは、私は自分のコントロール下のサーバーを持っていない、それはContent-Typeの属性( 'のHttpClientで間違ったencondingを返します。 getResponseBodyAsString() 'は応答ヘッダーのContent-Type属性からエンコーディングを受け取ります)。私はセットアップのAcceptとAccept-Charsetを試しましたが、要求ヘッダーで言及していますが、それは私を助けません。わかりやすく、それはサーバー上で何かが間違っていますが、私は所有者ではないので、変更はできません。 –

+1

あなたは運がありません。 –

+0

+1すばらしいコメント:-D –

0

免責事項:私は実際にはAPIを読んでいるだけで、HttpClientを知りません。

私はHttpResponseを返すexecuteメソッドを使用し、次に.getEntity().getContent()を使用します。これは純粋なバイトストリームなので、サーバーから渡されたエンコーディングを無視する場合は、単純に独自のInputStreamReaderをラップすることができます。オーケー


は、私が間違ったバージョンを持っていたように(当然、そこにあまりにも多くのHttpClientのクラスがあります)になります。

これまでと同じように、他のクラスにある:HttpMethodにはgetResponseBodyAsStream()メソッドがあり、その周りに独自のInputStreamReaderをラップすることができます。あなたが書いたように、それが大きすぎるといけない場合は、一度に配列全体を取得し、文字列に変換してください。

私は応答を変更し、HttpClientを分析することが正しい方法ではないと思う。


サーバー管理者/ webmasterに間違った文字セットについてのメッセージを送信することをお勧めします。

1

挨拶の人々、誰かがUTF-8で書くことのHttpClientを設定するためのグーグル、この記事を見つけた場合には

強行。ベスト

このコード行は便利でなければなりません...

response.setContentType("text/html; charset=UTF-8"); 

+2

こんにちは、コメントありがとうございます。どのようなオブジェクト 'レスポンス 'がどこにあるのかを明確にした完全なソースを投稿してください。 –

+0

ご挨拶、ありがとう!私はHttpServletResponseの応答を言うのに十分であるべきだと思います。 – HommeDeJava

+2

こんにちは、Apache HttpClientを使ってデータをダウンロードしています。私は 'Servlet'で作業していないので、' HttpServletResponse'はありません。 –

関連する問題