Specsのテストコード(dispatch/oauth/src/test/scala/OAuthSpec.scala)が一番良いサンプルだったので抜粋してコード読解。
import org.specs._
object OAuthSpec extends Specification {
import dispatch._
import oauth._
import OAuth._
val svc = :/("term.ie") / "oauth" / "example" // *1, *2
val consumer = Consumer("key", "secret") // *3
"OAuth test host" should {
"echo parameters from protected service" in {
val h = new Http
val request_token = h(svc / "request_token.php" <@ consumer as_token) // *4, *5, *6
val access_token = h(svc / "access_token" <@ (consumer, request_token) as_token)
val payload = Map("identité" -> "caché", "identity" -> "hidden", "アイデンティティー" -> "秘密",
"pita" -> "-._~")
h(
svc / "echo_api.php" <<? payload <@ (consumer, access_token) >% { { // *7
_ must_== (payload)
}
)
}
}
}
- :/ はobject。:/() == :/.apply() メソッドで、dispatch.Requestを返す。(http://っぽいから:/にしたと思われ)
- / はRequestクラスのメソッド。パスをつなげて新しいRequestを返す。
- OAuthのコンシューマ・キー、コンシューマ・シークレットを保持するケースクラス。
- Http.apply()メソッドにRequestインスタンスを渡してHTTPリクエストを投げている。
- <@ はRequestSignerクラスのメソッド。Requestクラスをコンシューマ・シークレットで署名したりする。Request → RequestSignerはimplicit defされているのでそのまま呼べる。
- as_token はHttp.apply()の第2引数として渡されるハンドラ。レスポンスのbodyに含まれるトークンをTokenインスタンスにして返す。
- <<? はRequestクラスのメソッドで、クエリ文字列を付加した新しいRequestを返す。
参考文献など:
- dispatch.{Http, Request}のソース
- dispatch.oauth._のソース
- OAuthについては、@ITの記事が非常に参考になりました。
0 件のコメント:
コメントを投稿