我有一个用 Finch 框架编写的具有多个端点的 RESTFul 服务。一些端点需要支持跨域请求的 JSONP。通过检查 Finch 的源代码,似乎没有一种简单的方法可以做到这一点。我发现这个页面有点相关,但不太了解细节。
https://groups.google.com/forum/#!topic/finaglers/nAaCfOiLp1w
有人可以给我一些指导/例子吗?我的返回值希望看起来像:
{
ids:[id1,id2,id3...idn]
}
我有一个用 Finch 框架编写的具有多个端点的 RESTFul 服务。一些端点需要支持跨域请求的 JSONP。通过检查 Finch 的源代码,似乎没有一种简单的方法可以做到这一点。我发现这个页面有点相关,但不太了解细节。
https://groups.google.com/forum/#!topic/finaglers/nAaCfOiLp1w
有人可以给我一些指导/例子吗?我的返回值希望看起来像:
{
ids:[id1,id2,id3...idn]
}
不详细说明为什么 JSONP 被认为不安全(我假设您已经知道这一点),您引用的 Finaglers 线程提到JsonpFilter
可以应用于返回 JSON 以将其“升级”到 JSONP 的 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"});