为什么这不起作用 - jsonp和REST Easy?

时间:2013-03-26 19:39:47

标签: jquery jsonp resteasy

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 Easy方法

@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”

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

2 个答案:

答案 0 :(得分:2)

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

  

如果你正在使用杰克逊,Resteasy有你可以打开的JSONP   添加提供者   org.jboss.resteasy.plugins.providers.jackson.JacksonJsonpInterceptor   (Jackson2JsonpInterceptor,如果您正在使用Jackson2提供商)   你的部署。如果响应的媒体类型是json和a   给出回调查询参数,响应将是一个javascript   使用回调定义的方法的方法调用的代码段   参数。例如:

     

GET / resources / stuff?callback = processStuffResponse会产生这个   响应:

     

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

     

您可以通过设置更改回调参数的名称   callbackQueryParameter属性。

然而,由于RESTEASY-1168: Jackson2JsonpInterceptor does not render closing bracket

,它似乎是borken

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

这导致&#34; Uncaught SyntaxError:Unexpected Identifier&#34;错误

我已经修复了一个pull-request并修复了它,希望它能进入下一个版本3.0.12

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

答案 1 :(得分:0)

注意:这是在应用程序中执行此操作的最糟糕方式,您需要检查可用的框架支持。这只是演示了如何添加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 + "\"})";
    }
}