Java 带有Jersey和jQuery的RESTfull Web服务得到奇怪的响应
我尝试构建一个RESTfull Web服务 在前端,我使用jQuery获取数据 在后端,我正在使用来自www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson的示例进行尝试/ 从浏览器中调用127.0.0.1:8080/restEx/rest/json/get,我得到了预期的答案:Java 带有Jersey和jQuery的RESTfull Web服务得到奇怪的响应,java,jquery,rest,jersey-1.0,Java,Jquery,Rest,Jersey 1.0,我尝试构建一个RESTfull Web服务 在前端,我使用jQuery获取数据 在后端,我正在使用来自www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson的示例进行尝试/ 从浏览器中调用127.0.0.1:8080/restEx/rest/json/get,我得到了预期的答案: {"title":"Enter Sandman","singer":"Metallica"} 但是,当我尝试使用$.get()获取这些数据
{"title":"Enter Sandman","singer":"Metallica"}
但是,当我尝试使用$.get()获取这些数据时,没有得到任何答案。
查看Firebug告诉我,我没有得到数据
我也试过了
return Response.ok("{status: 'success'}").header("Access-Control-Allow-Origin", "*").build();
正如我在另一个问题中发现的那样
在Firebug中,我现在看到了数据,但jQuery仍然没有执行success函数。我仍然只看到fail函数
那么我做错了什么?我怎样才能让这些东西起作用
我正在使用jQuery 2.0.2和Jersey 1.8(我在Jersey.java.net/documentation/latest/getting started.html中使用Jersey 2进行了尝试,并以相同的结果运行了项目),该项目部署在Tomcat 7上
index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="assets/js/jquery-2.0.2.js"></script>
</head>
<body>
<div id="first" class="container"></div>
<script type="text/javascript">
var url = "http://127.0.0.1:8080/restEx/rest/json/get";
$.get(url, {}, function(){alert("success");},"json")
.fail(function(){alert("fail");})
;
</script>
</body>
</html>
Track.java
package com.mkyong;
public class Track {
String title;
String singer;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "Track [title=" + title + ", singer=" + singer + "]";
}
}
错误的URL,更改
http://127.0.0.1:8080/restEx/rest/json/test
至http://127.0.0.1:8080/restEx/rest/json/get
:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="assets/js/jquery-2.0.2.js"></script>
</head>
<body>
<div id="first" class="container"></div>
<script type="text/javascript">
var url = "http://127.0.0.1:8080/restEx/rest/json/get";
$.get(url, {}, function(){alert("success");},"json")
.fail(function(){alert("fail");})
;
</script>
</body>
</html>
变量url=”http://127.0.0.1:8080/restEx/rest/json/get";
$.get(url,{},function(){alert(“success”);},“json”)
.fail(函数(){alert(“fail”);})
;
多亏了Marcos Zolnoswski的链接,我才得以解决我的问题。
通过这里提供的信息,我能够找到一个解决方案,该解决方案描述了如何将缺少的头添加到所有请求中
作为my Jersey Servlet的init参数:
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>your.package.ResponseCorsFilter</param-value>
</init-param>
即使使用正确的URL,行为也会发生:(我尝试使用这个Servlet时也使用了相同的行为:公共类JSONServlet扩展了HttpServlet{public void doGet(HttpServletRequest,HttpServletResponse)response.setContentType(“application/json”);PrintWriter out=response.getWriter();out.println(arrayObj);out.close();}}现在您遇到了交叉请求问题。如果您尝试以下技巧,可能会奏效:。谢谢您的提示。根据这些信息,我能够解决我的问题。我还发现了这个问题。
package com.mkyong;
public class Track {
String title;
String singer;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSinger() {
return singer;
}
public void setSinger(String singer) {
this.singer = singer;
}
@Override
public String toString() {
return "Track [title=" + title + ", singer=" + singer + "]";
}
}
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="assets/js/jquery-2.0.2.js"></script>
</head>
<body>
<div id="first" class="container"></div>
<script type="text/javascript">
var url = "http://127.0.0.1:8080/restEx/rest/json/get";
$.get(url, {}, function(){alert("success");},"json")
.fail(function(){alert("fail");})
;
</script>
</body>
</html>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>your.package.ResponseCorsFilter</param-value>
</init-param>
package yoiur.package.security;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
public class ResponseCorsFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest req, ContainerResponse contResp) {
ResponseBuilder resp = Response.fromResponse(contResp.getResponse());
resp.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
String reqHead = req.getHeaderValue("Access-Control-Request-Headers");
if(null != reqHead && !reqHead.equals("")){
resp.header("Access-Control-Allow-Headers", reqHead);
}
contResp.setResponse(resp.build());
return contResp;
}
}