【问题标题】:RESTfull Webservice with Jersey and jQuery get strange response带有 Jersey 和 jQuery 的 RESTful Web 服务得到奇怪的响应
【发布时间】:2013-07-10 21:09:45
【问题描述】:

我尝试构建一个 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() 获取这些数据时,我没有得到任何答案。 查看 Firebug 告诉我,我没有得到数据。

我也试过了

return Response.ok("{status: 'success'}").header("Access-Control-Allow-Origin", "*").build();

正如我在另一个问题中找到的解决方案 现在在 Firebug 中,我看到了数据,但 jQuery 仍然没有执行成功函数。我仍然只看到失败功能。

那么我做错了什么?我怎样才能让这些东西发挥作用?

我正在使用 jQuery 2.0.2、Jersey 1.8(我在 jersey.java.net/documentation/latest/getting-started.html#running-project 中使用 Jersey 2 进行了尝试,结果相同)并且项目部署在雄猫 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>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong.common</groupId>
    <artifactId>RESTfulExample</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>RESTfulExample Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <repositories>
        <repository>
            <id>maven2-repository.java.net</id>
            <name>Java.net Repository for Maven</name>
            <url>http://download.java.net/maven/2/</url>
            <layout>default</layout>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
            <version>1.8</version>
        </dependency>

        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.8</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>restEx</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

web.xml

<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Restful Web Application</display-name>

    <servlet>
        <servlet-name>jersey-serlvet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>com.mkyong.rest</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

JSONService.java

package com.mkyong.rest;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import com.mkyong.Track;

@Path("/json")
public class JSONService {

    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public Track getTrackInJSON() {

        Track track = new Track();
        track.setTitle("Enter Sandman");
        track.setSinger("Metallica");

        return track;

    }

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createTrackInJSON(Track track) {

        String result = "Track saved : " + track;
        return Response.status(201).entity(result).build();

    }


    @GET @Path("/test") @Produces(MediaType.APPLICATION_JSON)
    public JSONObject test() throws JSONException{
        return new JSONObject("{status:'success'}");
    }
}

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 + "]";
    }

}

【问题讨论】:

    标签: java jquery rest jersey-1.0


    【解决方案1】:

    网址错误,将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 正确,行为也会发生 :( 我尝试使用此 Servlet 也具有相同的行为: public class JSONServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) response.setContentType("application/ json"); PrintWriter out = response.getWriter(); out.println(arrayObj); out.close(); } }
    • 现在您遇到了交叉请求问题。如果你试试这个技巧,也许会奏效:link.
    • 感谢您的提示。有了这些信息,我就能解决我的问题。我还发现了这个link
    【解决方案2】:

    感谢 Marcos Zolnoswski 的链接,我能够解决我的问题。 通过那里提供的信息,我能够找到http://blog.usul.org/cors-compliant-rest-api-with-jersey-and-containerresponsefilter/,其中描述了如何将缺少的标头添加到所有请求的解决方案。

    作为我的 Jersey Servlet 的初始化参数:

    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
        <param-value>your.package.ResponseCorsFilter</param-value>
    </init-param> 
    

    ResponseCorsFilter.java

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2014-01-12
      • 2011-11-15
      • 1970-01-01
      • 2014-09-13
      • 2017-05-24
      相关资源
      最近更新 更多