タイトルの通りのことをやったのでメモ。

なにがしたいのか


AuthorizationヘッダにトークンをつけてAPIを叩いてデータ取得したい。curlでいう下記のコマンド。

1
curl -H "Authorization: token <yourtoken>" https://api.example.com/hoge

コード


だいたい公式ドキュメントに書いてあるのでその通りに参考にしながら書くと下記のような感じになる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext
import akka.actor.ActorSystem
import akka.http.scaladsl.model.headers.{Authorization, OAuth2BearerToken}
import akka.http.scaladsl.model.{HttpMethods, HttpRequest, Uri}
import akka.http.scaladsl.Http
import akka.http.scaladsl.unmarshalling.Unmarshal
import akka.stream.ActorMaterializer

object HttpRequestTest extends App {

implicit val actorSystem: ActorSystem = ActorSystem("exampleActor")
implicit val materializer: ActorMaterializer = ActorMaterializer()
implicit val executionContext: ExecutionContext = actorSystem.dispatcher
private val api = "https://api.example.com/hoge"
private val token = "token"

val request = HttpRequest(
HttpMethods.GET,
uri = Uri(api),
headers = List(Authorization(OAuth2BearerToken(token)))
)

Http().singleRequest(request).onComplete {
case Success(s) => {
Unmarshal(s.entity).to[String].onComplete {
case Success(x) => println(x)
case Failure(throwable: Throwable) => println(throwable.toString)
}
}
case Failure(throwable: Throwable) => println(throwable.toString)
}
}

レスポンスはFutureで帰ってくるのでonCompleteで成否を分けて処理している。

詰まる点といえばレスポンスのbody部の取得方法だが、stack overflowの回答が参考になった