这个服务做错了吗?

时间:2014-03-02 23:14:01

标签: jquery web-services jsonp getjson jersey-2.0

我想构建一个能够发回JSONP

的网络服务

我的服务如下所示

@GET
@Path("user/{id}")
@Produces({"application/javascript", MediaType.APPLICATION_JSON})
@JSONP(callback= "eval",queryParam = "callback")
public Response getUser(@PathParam("id") int id, @Context HttpHeaders headers
) {
    //for (MediaType mediaType : headers.getAcceptableMediaTypes()) {
    //    System.out.println(mediaType);
    //}

    User u = UserDao.instance.getModel().get(Integer.toString(id));
    Response res = Response.status(Response.Status.OK).entity(u).build();
    return res;

}

是不是?还是错的?

当我使用Jquery访问服务时(我是jquery atm的新手)我收到错误,以下是我用来访问服务的代码。

  jQuery.ajax({
        type: "GET",
        url: "http://localhost:8084/simple-service/webapi/myresource/user/1",
        dataType: "jsonp",
        success: function(results) {
            alert("Success!");
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Error");
        }
    });

我在这里做错了吗?我有两个不同的错误消息:

  • 来自firefox:“SyntaxError:missing; before statement”,用“1:1”代替行号。点击1:1会弹出一个弹出窗口并显示以下{"id":"1","name":"Brittni","surname":"North"}
  • 表格铬: “Uncaught SyntaxError:Unexpected token:”,显示了同样内容的firefox弹出窗口。

看起来好像缺少回调功能的名称? :S

你能帮我发现我做错了什么吗? :D谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

好的伙计们!我自己解决了这个问题,如果你对它感兴趣,这就是解决方案。

如果您希望在不在同一个来源时访问该服务,则以下是该服务的代码: 在响应上设置标题,另外添加@Jsonp注释。

 @GET
    @Path("user/{id}")
    @Produces({"application/javascript", MediaType.APPLICATION_JSON})
    @JSONP(callback= JSONP.DEFAULT_CALLBACK,queryParam = JSONP.DEFAULT_QUERY)
    public Response getUser(@PathParam("id") int id, @Context HttpHeaders headers
    ) {
        User u = UserDao.instance.getModel().get(Integer.toString(id));
        Response res = Response.status(Response.Status.OK).entity(u).build();
        res.getHeaders().add("Access-Control-Allow-Origin", "*");
        res.getHeaders().add("Access-Control-Allow-Headers",
                "origin, content-type, accept, authorization");
        res.getHeaders().add("Access-Control-Allow-Credentials",
                "true");
        res.getHeaders().add("Access-Control-Allow-Methods",
                "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        return res;

    }

对于跨域调用,请使用ajax请求中的内置标志。其他字段(如dataType)将由jquery以智能方式自动填充。

    jQuery.ajax({
        type: "GET",
        url: "http://localhost:8084/simple-service/webapi/myresource/user/" + e.data.id,
        crossDomain: true,
        success: function(results) {
            console.log("Success!");
            $this.trigger("populate", [results]);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("Error");
        }
    });