Commons HttpClientでPOSTパラメータ日本語文字化け
Commons HttpClient(3.0RC3)でPOSTメソッドのパラメータの値に日本語を指定すると文字化けます。このクライアントプログラムを実行すると
PostMethod method = new PostMethod("http://localhost:8080/testweb/hoge"); //method.addRequestHeader(new Header("Content-Type","text/html; charset=Shift_JIS")); method.addParameter("param1", "value1"); method.addParameter("param2","日本語"); int result = client.executeMethod(method);
サーバー側(サーブレットなど)で受け取ったパラメータが
param2=???
になっちゃいます。
HttpClientで、何もしないと、デフォルトのISO8859-1になるし、
リクエストヘッダにコンテントタイプ(上のaddRequestHeaderの行)を指定すると、なんか内部でエンコードしてるっぽいけど、ちゃんと動かない。何か指定すれば動くのか?
関連記事
http://www.tsujita.jp/blojsom/blog/default/Java/2005/01/21/20050121.html
http://kitaj.simojimo.org/20040731.html#p03
<追記>
PostMethodを継承して、getRequestCharSet()メソッドで使いたいcharsetを返せば、とりあえずは文字化けせずに動くようだ。
import org.apache.commons.httpclient.methods.PostMethod; public class PostMethodEx extends PostMethod{ public PostMethodEx(String uri){ super(uri); } public String getRequestCharSet() { return "Shift_JIS"; } }
PostMethod method = new PostMethodEx("http://localhost:8080/testweb/hoge"); ...
でも正しい方法なのかどうか謎。3.0はCodecとか謎のライブラリも使っててわけわからんし、たいした用事のプログラムでもない(動けばいい)ので、あまり深みにはまりたくない。ちょっとしたツールでちょっとしたことにしか利用しないから、(もしバグだったら)いつまでも直らないのかも。
関連メソッドはこのへんぽい
org.apache.commons.httpclient.methods.PostMethod#generateRequestEntity()
org.apache.commons.httpclient.methods.EntityEnclosingMethod#getRequestCharSet()
org.apache.commons.httpclient.util.EncodingUtil#doFormUrlEncode(NameValuePair[] pairs, String charset)