JSONP が安全でないと見なされた理由の詳細には立ち入らず (すでにご存知だと思います)、あなたが参照している Finaglers スレッドは、JsonpFilter
JSON を返す HTTP サービスに適用して JSONP に「アップグレード」できることについて言及しています。
このフィルターを Finch のエンドポイントに接続する方法の小さな例を次に示します。
import com.twitter.finagle.Http
import com.twitter.finagle.http.filter.JsonpFilter
import io.finch._
import io.finch.circe._
val endpoint: Endpoint[Map[String, String]] = get("jsonp") {
Ok(Map("foo" -> "bar"))
}
val service = endpoint.toServiceAs[Application.Json]
Http.server.serve(":8080", JsonpFilter.andThen(service))
JsonpFilter
とてもシンプルです。返された HTTP ペイロードをチェックし、それは JSON 文字列です。名前がcallback
クエリ文字列パラメーターに渡される関数の呼び出しでラップします (それに応じて content-type を変更しますapplication/javascript
)。httpie を使用すると、次のようになります。
$ http :8081/jsonp
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 39
Content-Type: application/json
{
"foo": "bar"
}
$ http :8080/jsonp?callback=myfunction
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 56
Content-Type: application/javascript
/**/myfunction({"foo":"bar"});