Scalaで何か作ってみよう2

HttpClientを使ってTwitterにPostすることができました。やったね!
http://twitter.com/syttru/status/1327714655

ハマったとこ

TwitterにPostするとき、以下のリクエストヘッダーを送ると417エラーが返ってきてしまうみたいです。

Except: 100-Continue

このリクエストヘッダーが何なのかはよくわかりませんでしたが、DefaultHttpClientでPostしようとするとこのヘッダーが自動的に送られてしまうようで、こいつを外す方法が分からずにハマりました。

val client = new DefaultHttpClient
client.getParams.setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false)

HttpClientのパラメータで「ExpectContinueを使う」みたいなのがあるみたいで、そいつをオフにするとヘッダーはつかなくなるようです。
こんなもんわかるかー!!


あと、POSTするときはコンテントタイプを指定してあげないといけないみたいです。

val post = new HttpPost("http://twitter.com/statuses/update.xml")
post.addHeader("Content-Type", "application/x-www-form-urlencoded")

どうしてExpectContinueなんていうマニアックなものは自動的にリクエストヘッダに追加してくれるのに、コンテントタイプは追加してくれないんだー。って思いました。

ソースコード

package syttru.twitter

import org.junit._
import Assert._

import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity
import org.apache.http.auth.{AuthScope,UsernamePasswordCredentials}
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.params.CoreProtocolPNames

import java.io.{BufferedReader,InputStreamReader}

@Test
class HttpClientTest {
    
    @Test
    def testTwitterUpdate() {
      val client = new DefaultHttpClient
      client.getCredentialsProvider.setCredentials(
        new AuthScope("twitter.com", 80), 
        new UsernamePasswordCredentials("syttru@gmail.com", "********"))
      client.getParams.setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false)
      
      val post = new HttpPost("http://twitter.com/statuses/update.xml")
      post.addHeader("Content-Type", "application/x-www-form-urlencoded")
      post.setEntity(new StringEntity("status=テスト更新あああ", "UTF-8"))
      
      val response = client.execute(post)
      
      val input = new BufferedReader(new InputStreamReader(response.getEntity.getContent))
      var line = ""
      while({line=input.readLine; line != null}) {
        println(line)
      }
      
      client.getConnectionManager.shutdown
    }

}

長い…

思ったこと

何も考えずに書くと非常に長くなってしまう。HttpClientの実装を作らないといかん。
リクエストパラメータがキーと値のマップで指定できないと不便だ。


HttpClientのjavadocがcoreとclientの2つに分かれてしまったので非常に見づらい。
ここにリンクを張っておこう。