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 } }
長い…