0

我有一个用 Finch 框架编写的具有多个端点的 RESTFul 服务。一些端点需要支持跨域请求的 JSONP。通过检查 Finch 的源代码,似乎没有一种简单的方法可以做到这一点。我发现这个页面有点相关,但不太了解细节。

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

有人可以给我一些指导/例子吗?我的返回值希望看起来像:

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

1 回答 1

1

不详细说明为什么 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"});
于 2016-11-09T00:07:22.953 回答