は(私はあなたがすでにあることを知っていると仮定)JSONPが安全でないとみなさ理由の詳細に入るれていない、あなたが参照しているFinaglersスレッドがに適用することができJsonpFilter
に言及しますそれをJSONPに「アップグレード」するためにJSONを返すHTTPサービス。
このフィルタを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
クエリ文字列パラメータで渡された関数の呼び出しでラップされます(対応するコンテンツタイプを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"});
ありがとうございました。これはまさに私が望んでいたものです。私はコールバックを定義する場所を探していましたが、あなたの答えを読むまで、JsonpFilterは自動的にそれを追加することを認識しませんでした。 すべてのWebサービスコールをブラウザに入れるのは馬鹿げた考えです。 Xドメインコールのバックエンドで私たちのAPIを呼び出すようにクライアントに依頼することを本当に難しくしなければならないかどうかの提案はありますか? CORSを使用することによって、後方互換性の問題を解決することはできません。 –
うーん、待って、まだいくつかの問題がある: –