【问题标题】:Why doesn't this work - jsonp and REST Easy?为什么这不起作用 - jsonp 和 REST Easy?
【发布时间】:2013-03-16 18:33:54
【问题描述】:

JS代码

<html>
<head>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
    $.getJSON("http://localhost:8080/gbsshop/rest/auth/test/xyz?callback=?", function (data) {
        alert("52");
    });
    </script>
</head> 
</html>

REST 简单方法

@GET
    @POST
    @Path("/test/{param}")
    @Produces({MediaType.APPLICATION_JSON })
    public String returnMessage(@PathParam("param") String msg) {
        System.out.println("~~~~~~~~~~~~~"+msg+"~~~~~~~~~~~~");
        return "HEllo "+msg;

    }

我看到服务器收到调用,但浏览器失败并显示“Uncaught SyntaxError: Unexpected Identifier”

感谢任何帮助。谢谢你的时间。

【问题讨论】:

  • 因为它是一个 jsonp 请求,所以响应的格式应该是&lt;callback-name&gt;({&lt;jsonobject&gt;}),例如:mycallback({msg: 'my-message'})
  • 回调方法的名称可作为请求参数callback
  • 真的吗? - 我认为“某人”会在后台处理这个问题。我认为您只需要从服务器发送 json 数据而不必将其包装在回调函数中。这会使我的代码在服务器上看起来很难看。我是否误解了您的评论,或者您真的是说我应该从我的 returnMessage 函数返回 - callbackName({result:"john"})?这不是不整洁吗?有没有更好的办法。我现在正在尝试你的建议。谢谢
  • @Mustafa 回调方法是 JSONP 的工作方式。你甚至需要 JSONP 吗?如果你的前端和 REST 服务在同一个域中,你可以使用普通的 JSON
  • How enable JSONP in RESTEasy? 的可能重复项

标签: jquery jsonp resteasy


【解决方案1】:

Resteasy claims to support JSONP 在 3.x 版本中开箱即用:

如果您使用的是 Jackson,Resteasy 有 JSONP,您可以通过 添加提供者 org.jboss.resteasy.plugins.providers.jackson.JacksonJsonpInterceptor (Jackson2JsonpInterceptor 如果您使用的是 Jackson2 提供程序) 你的部署。如果响应的媒体类型是 json 和 给定回调查询参数,响应将是一个javascript sn -p 与回调定义的方法的方法调用 范围。例如:

GET /resources/stuff?callback=processStuffResponse 将产生这个 回复:

processStuffResponse() 这个支持默认 jQuery 的行为。

您可以通过设置 callbackQueryParameter 属性。

但是,由于RESTEASY-1168: Jackson2JsonpInterceptor does not render closing bracket,它似乎很糟糕

所以 foo({"foo":"bar"} 被渲染而不是 foo({"foo":"bar"})

这会导致“Uncaught SyntaxError: Unexpected Identifier”错误

我已经提交了一个带有修复程序的pull-request,希望它应该进入下一个版本 3.0.12

我知道这个问题很老了,但是当你搜索resteasy jsonp问题时它显示在Google的第一页,所以我决定更新它

【讨论】:

    【解决方案2】:

    注意:这是在应用程序中执行此操作的最糟糕的方法,您需要检查哪些框架支持可能可用。这只是演示如何添加 jsonp 支持

    我不知道 REST Easy,我这里来猜猜

    @GET
    @POST
    @Path("/test/{param}")
    @Produces({MediaType.APPLICATION_JSON })
    public String returnMessage(@PathParam("param") String msg, @QueryParam("callback") String callback) {
        System.out.println("~~~~~~~~~~~~~"+msg+"~~~~~~~~~~~~");
         return callback + "({msg: \"" + msg + "\"})";
    }
    

    然后

    $.getJSON("http://localhost:8080/gbsshop/rest/auth/test/xyz?callback=?", function (data) {
        alert(data.msg);
    });
    

    实际上你必须同时支持 json 和 jsonp 请求,所以你可能需要

    @GET
    @POST
    @Path("/test/{param}")
    @Produces({MediaType.APPLICATION_JSON })
    public String returnMessage(@PathParam("param") String msg, @QueryParam("callback") String callback) {
        System.out.println("~~~~~~~~~~~~~"+msg+"~~~~~~~~~~~~");
        if (callback == null || callback == "") {
            return "{msg: \"" + msg + "\"}";
        } else {
            return callback + "({msg: \"" + msg + "\"})";
        }
    }
    

    【讨论】:

    • 我正在尝试这个 Arun。但我想要一个更干净的服务器端代码。还有什么建议吗?谢谢。
    • @Arun 我怀疑这会起作用。问题是框​​架可能会尝试使用像 Jackson 这样的 JSON 库来转换字符串结果。上面提到的重复问题有更好的解决方案
    • Phil 我也在检查那个。谢谢
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 2021-02-15
    • 2011-06-08
    • 2011-08-19
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多