문제

I want to build a web service that is able to send back a JSONP

My service looks like the following

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

}

Is it right? or wrong?

when I access the service with Jquery (I'm a newbie to jquery atm) I get an error, the following is the code that I use to access the service.

  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");
        }
    });

Am I doing something wrong here? I have two different error messages:

  • from firefox: "SyntaxError: missing ; before statement", with "1:1" in place of line number. By clicking 1:1 a pop up shows up and displays the following {"id":"1","name":"Brittni","surname":"North"}
  • form chrome: "Uncaught SyntaxError: Unexpected token : ", shows the same pop up of firefox with the same content.

It looks like is missing the name of the callback fucntion? :S

Can you help me spotting out what I am doing wrong? :D thanks for helping!

도움이 되었습니까?

해결책

ok guys! I solved it by my self, here is the solution if you are interested at it.

Here is the code of the service if you want to reach it when you are not in the same origin: set the headers over the response, additionally add the @Jsonp annotation.

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

    }

For Cross-domain call, use the built in flags in the ajax request. The other fields (like dataType) will be automagically filled by jquery in a smart fashion.

    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");
        }
    });
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top