2016-11-08 2 views
0

私は、複数のエンドポイントを持つFinchフレームワークで書かれたRESTFulサービスを持っています。いくつかのエンドポイントは、クロスドメイン要求に対してJSONPをサポートする必要があります。 Finchのソースコードをチェックすることで、簡単な方法ではないように見えます。私はこのページの種類の関連性はあるものの、詳細をあまり知りませんでした。jsonpをサポートするFinchエンドポイント?

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

誰かが私にいくつかのガイドライン/例を与えることができますか?私の戻り値は次のようになりしたい :

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

答えて

1

は(私はあなたがすでにあることを知っていると仮定)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"}); 
+0

ありがとうございました。これはまさに私が望んでいたものです。私はコールバックを定義する場所を探していましたが、あなたの答えを読むまで、JsonpFilterは自動的にそれを追加することを認識しませんでした。 すべてのWebサービスコールをブラウザに入れるのは馬鹿げた考えです。 Xドメインコールのバックエンドで私たちのAPIを呼び出すようにクライアントに依頼することを本当に難しくしなければならないかどうかの提案はありますか? CORSを使用することによって、後方互換性の問題を解決することはできません。 –

+0

うーん、待って、まだいくつかの問題がある: –

関連する問題