0

複数のエンドポイントを持つ Finch フレームワークで記述された RESTFul サービスがあります。一部のエンドポイントは、クロス ドメイン リクエストのために JSONP をサポートする必要があります。Finch のソース コードを確認すると、簡単な方法はないようです。このページは関連しているようですが、詳細はよくわかりません。

https://groups.google.com/forum/#!topic/finaglers/nAaCfOiLp1w

誰かが私にいくつかのガイドライン/例を教えてもらえますか? 私の戻り値は次のようになりたいです:

{
    ids:[id1,id2,id3...idn]
}
4

1 に答える 1

1

JSONP が安全でないと見なされた理由の詳細には立ち入らず (すでにご存知だと思います)、あなたが参照している Finaglers スレッドは、JsonpFilterJSON を返す 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"});
于 2016-11-09T00:07:22.953 に答える