Scala で HTTP POST やろうとしてハマったメモ

はてなグラフAPIを利用するモジュールをScalaで書いてる時に、HTTP POST 周りでちょっとハマったのでメモ。
HTTPライブラリとしてはこちらを利用しました。
Apache HttpComponents - Apache HttpComponents


さて、どこではまったかというと、POSTパラメータのセット。
Javadocやら見てると、それらしいメソッドがあるのでてっきり次のようにして出来るかと思ったら、パラメータ(以下の例だと"value")がセットされていなかった。

  • ダメ

//HttpParams にパラメータセット
val params = new BasicHttpParams
params.setParameter("value", value)
//HttpPost を用意し、パラメータをセット
val post = new HttpPost("http://hoge.com/fuga/")
post.setParams(params)
//実行
val client = new DefaultHttpClient
val response = client.execute(post)


あれこれ試行錯誤した結果、次のやり方でよいということになった。

  • イケル

//NameValuePair のArrayList を用意して、
//そこに BasicNameValuePair を追加していく
val params: java.util.List[NameValuePair] = new ArrayList()
params.add(new BasicNameValuePair("value",value))
//HttpPost を用意し、パラメータをセット
val post = new HttpPost("http://hoge.com/fuga/")
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8))
//実行
val client = new DefaultHttpClient
val response = client.execute(post)


参考にしたのがJavaのサンプルなので、もっとScalaっぽい書き方ができるのかもしれない。
単純に移植するだけでもJavaに比べて記述がわりと簡潔になるもんだなーという感想。


前者の手法のほうがすっきりするので、なんとかできないかとがんばってはみたものの、結局解決には至らず。
setParameterとはいったい・・・うごごご・・・。


(参考)
HttpClient 4.0-beta2を使う POST編 - Javaと情熱のあいだ
AndroidでPOST通信 | 5ive.blog