【问题标题】:Finch endpoint to support jsonp?Finch 端点支持 jsonp?
【发布时间】:2016-11-09 08:07:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: jsonp finch


    【解决方案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"});
    

    【讨论】:

    • 非常感谢弗拉德。这正是我想要的。我一直在寻找定义回调的位置,但在阅读您的答案之前,并没有意识到 JsonpFilter 会自动添加它。将每个 Web 服务调用都放在浏览器中是一个愚蠢的想法。有什么建议我是否应该非常努力地要求客户在后端调用我们的 API 以进行 X 域调用?我们无法承受使用 CORS 的向后兼容性问题。
    • 嗯,等等,还是有问题:
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 2017-02-13
    • 2014-05-07
    • 2016-09-03
    • 2018-11-25
    • 2015-06-15
    • 2013-01-18
    • 2013-06-24
    相关资源
    最近更新 更多