【问题标题】:Calling Rest webservice using JQuery Ajax call , web service is returning JSON string使用 JQuery Ajax 调用调用 Rest Web 服务,Web 服务返回 JSON 字符串
【发布时间】:2012-02-28 11:29:55
【问题描述】:

我已经做了一个 Rest Web 服务:

package org.jboss.samples.rs.webservices;


import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.Path;



@Path("/MyRESTApplication")
public class HelloWorldResource {


    @GET()
    @Produces("application/json")
    @Path("/dealInfo/{dealId}")
    public String sayHello(@PathParam("dealId") int dealId) {
        System.out.println("dealid......"+dealId);
        switch(dealId) {
        case 1 :System.out.println("employee id.....");
            return "{'name':'George Koch', 'age':58}";
        case 2:
            return "{'name':'Peter Norton', 'age':50}";
        default:
            return "{'name':'unknown', 'age':-1}";
    } // end of switch

    }
}

当我进入 Internet Explorer 并在地址栏中输入:

http://localhost:8080/nagarro-0.0.1-SNAPSHOT/MyRESTApplication/dealInfo/2

它给了我:

{'name':'Peter Norton', 'age':50}

但是当我在 JQuery 方法中使用 ajax 调用来调用它时。例如

$.ajax({  
           type: "GET",  
           url: "http://localhost:8080/nagarro-0.0.1-SNAPSHOT/MyRESTApplication/dealInfo/2",  
           data: "",  
           success: function(resp){  
             // we have the response  
             alert("Server said123:\n '" + resp + "'");  
           },  
           error: function(e){  
             alert('Error121212: ' + e);  
           }  
         });

我在此调用中遇到错误。

当我在 IE 中使用 F12 进行调试时,我也得到了关注

"Invalid JSON: {\'name\':\'Peter Norton\', \'age\':50}"

谁能告诉我电话中可能出现的问题。

【问题讨论】:

  • 如何调用这个网络服务?

标签: jquery json web-services


【解决方案1】:

你的服务和输出是对的。

问题是相同的源策略http://en.wikipedia.org/wiki/Same_origin_policy

Ajax 不允许访问内层服务。 比如在www.example.com/index.html,就不能访问 www.example.com/service/book?id=1。 因为您将上下文路径从 www.example.com 更改为 www.example.com/service/book。 出于安全考虑,这是不允许的,但我们有一个解决方案

以前,我有同样的问题,我用下面的代码解决了它。 我认为它可以帮助你。 重点是dataType: 'json'

功能测试服务() { $.ajax( { 数据类型:'json', 标题:{ 接受:“应用程序/json”, “访问控制允许来源”:“*” }, 类型:'GET', url:'http://localhost:8080/service/book/search/1', 成功:函数(数据) { document.writeln("图书编号:" + data.id); document.writeln("书名:" + data.name); document.writeln("描述:" + data.description); }, 错误:函数(数据) { 警报(“错误”); } }); }

【讨论】:

    【解决方案2】:

    我认为您没有返回有效的 json:尝试类似:

      return  "{\"name\":\"unknown\", \"age\":-1}"
    

    因为这个

    {
        "name": "unknown",
        "age": -1
    }
    

    是一个有效的 JSON(您必须使用 ",而不是 '),而这不是

    {
        'name': 'unknown',
        'age': -1
    }
    

    您还应该指定数据类型

     $.ajax({  
           type: "GET",  
           url: "http://localhost:8080/nagarro-0.0.1-SNAPSHOT/MyRESTApplication/dealInfo/2",  
           dataType: "json",  
           success: function(resp){  
             // we have the response  
             alert("Server said123:\n '" + resp.name + "'");  
           },  
           error: function(e){  
             alert('Error121212: ' + e);  
           }  
         });
    

    【讨论】:

    • 它工作正常,但我只想知道,每当我们指定 @Produces(application/json) 时,为什么需要在客户端提供数据类型为 JSON。
    • @SAM 没必要,我认为 jQuery 会猜对(虽然我不是 java 专家)
    【解决方案3】:

    使用http://jsonlint.com/ 验证您的输出。 您的报价无效。

    {"name":"toto"} is ok
    
    {'name':'toto'} is not
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多