【问题标题】:Access Jersey based RESTful service using jQuery使用 jQuery 访问基于 Jersey 的 RESTful 服务
【发布时间】:2013-10-21 19:16:17
【问题描述】:

我正在尝试访问在 Java 上创建并在 Jersey 的帮助下使用 jQuery 部署的 RESTful 服务。

如果我使用浏览器访问它,我会得到结果,但是从 jQuery 中,我得到一个错误并且在页面上看不到任何结果。

带有脚本的页面托管在本地 Apache 服务器上,并且服务在同一台机器上使用 Jersey/Grizzly 单独运行。

我可以看到该服务正在发送响应并且它有 200 个代码,但我不断收到来自 .ajax 的错误,没有任何详细信息并且 有什么建议吗?

服务:

@Path("/helloworld")

公共类 HelloWorldResource {

@GET
@Produces
public String test(){
    System.out.println("Sending response");
    return "test";
}

}

主要:

 public static void main(String[] args) throws IOException {

    final String baseUri = "http://localhost:9998/";
    final Map<String, String> initParams = new HashMap<String, String>();
    initParams.put("com.sun.jersey.config.property.packages",
            "resources");
    System.out.println("Starting grizly");
    SelectorThread threadSelector = GrizzlyWebContainerFactory.create(baseUri, initParams);

    System.out.println(String.format(
            "Jersey app started with WADL available at %sapplication.wadl\n"
            + "Try out %shelloworld\nHit enter to stop it...", baseUri, baseUri));
    System.in.read();
    threadSelector.stopEndpoint();
    System.exit(0);

}

JavaScript:

var serviceAddress = "http://192.168.1.2:9998/helloworld";
        function loadDeviceData(){
            $.ajax({
                DataType: "text",
                url: serviceAddress,
                success: function (data) {
                    alert("Data loaded: " + data);
                },
                error: function (xhr) {
                    alert(xhr.responseText + ' ' + xhr.status + ' ' + xhr.statusText);
                }
            });
        }

【问题讨论】:

    标签: java jquery jersey


    【解决方案1】:

    经过几天的研究和实验,我发现问题出在响应的标题中。为了能够使用来自服务的响应,我添加了自定义标头字段:

    “访问控制允许来源:*”

    新服务如下所示:

    @Path("/helloworld")
    public class HelloWorldResource {
    
    
        @GET
        @Produces
        public Response test(){
    
            return Response.ok("test").header("Access-Control-Allow-Origin", "*").build();
        }
    }
    

    【讨论】:

      【解决方案2】:

      您必须将 crossDomain 设置为 true 才能发出跨域请求

      var serviceAddress = "http://192.168.1.2:9998/helloworld";
              function loadDeviceData(){
                  $.ajax({
                      dataType:'html',
                      type:'GET',
                      crossDomain:true,
                      cache:false,
                      async:false,                    
                      url: serviceAddress,
                      success: function (data) {
                          alert("Data loaded: " + data);
                      },
                      error: function (xhr) {
                          alert(xhr.responseText + ' ' + xhr.status + ' ' + xhr.statusText);
                      }
                  });
              }
      

      更新

      如果您的服务需要身份验证,您可以这样做

      var serviceAddress = "http://192.168.1.2:9998/helloworld";
                  function loadDeviceData(){
                      $.ajax({
                          dataType:'html',
                          type:'GET',
                          crossDomain:true,
                          cache:false,
                          async:false,
                          xhrFields: {
                            withCredentials: true
                          },
                          username:'yourUsername', //not sure about the username and password options but you can try with or without them
                          password:'thePass',                    
                          url: serviceAddress,
                          success: function (data) {
                              alert("Data loaded: " + data);
                          },
                          error: function (xhr) {
                              alert(xhr.responseText + ' ' + xhr.status + ' ' + xhr.statusText);
                          }
                      });
                  }
      

      也使用 jquery 1.5.1 或更高版本,因为 crossDomain 和其他一些选项在早期版本中不可用。如需参考,请参阅此链接http://api.jquery.com/jQuery.ajax/

      【讨论】:

      • 感谢您的快速回复!但这并没有解决我的问题,我仍然无法获取数据并收到警报“0错误”...
      • 它的 dataType NOT DataType 也将 async 设置为 false 和 cache false...查看我已经编辑过的答案,也 设置 dataType 为html
      • 我试过了,现在 xhr.responseText 变成“未定义”,但仍然没有结果...
      • 你用的是什么版本的jquery?
      • 再确认一件事,您尝试访问的网址需要身份验证?
      【解决方案3】:

      如果您使用 javascript 函数来替换典型的表单提交,请注意您应该返回 false 的事实;在你的 javascript 函数的末尾!

      你可以在这里查看类似的问题http://forum.jquery.com/topic/jquery-newbie-3-9-2011

      其实这不是球衣的问题,而是javascript的问题

      【讨论】:

        猜你喜欢
        • 2015-02-21
        • 1970-01-01
        • 2018-01-30
        • 2011-03-26
        • 2016-08-29
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多