当 dataType 设置为 JSONP 时读取 JSON 响应

Posted

技术标签:

【中文标题】当 dataType 设置为 JSONP 时读取 JSON 响应【英文标题】:Reading JSON response when dataType is set to JSONP 【发布时间】:2013-01-15 18:25:43 【问题描述】:

我正在尝试发出 JSONP 请求以允许跨域。情况是我的服务器不处理 JSONP 请求,它将此请求理解为 JSON 并返回一个 JSON 对象:result: 1

这是我的 ajax 请求:

jQuery.ajax(
    type : 'POST',
    url : "https://example.com/addUser",
    data : 
        firstName : 'firstName',
        lastName : 'lastName',
        email : 'email@yopmail.com'
    ,
    crossDomain : true,
    jsonpCallback: "jsonpCallback",
    success : function(data) 
        alert(data);
    ,
    complete : function(jqXHR, textStatus) 
                //can do something here
    ,
    error : function (xhr, textStatus, errorThrown) 
        if(errorThrown=="jsonpCallback was not called") 
                console.log('caught it!');
        
            ,
    dataType : 'jsonp'
);

来自窗口控制台的读数:

Resource interpreted as Script but transferred with MIME type text/json: "https://example.com/addUser…Name=firstName&lastName=lastName&email=email%40yopmail.com&_=1359646137496".

Uncaught SyntaxError: Unexpected token : 

caught it!

正如预期的那样,它抛出了 parseerror 异常,我尝试处理它。但我的问题是,既然浏览器实际上得到了响应result:1,有没有办法可以解析它?

【问题讨论】:

您是否尝试更改数据,例如:var jsonBuilder = JSON.stringify(data : firstName : 'firstName', lastName : 'lastName', email : 'email@yopmail.com' ); 如果服务器不支持 JSONP,你不能向它发出 JSONP 请求。故事结局。唯一的方法是通过服务器上的脚本代理请求。 如果您尝试在complete 方法中使用console.log jqXHR.responseText 或在error 方法中使用xhr.responseText,会发生什么情况? 没有办法。 JSONP 只是使用动态创建的script 元素包含来自不同 URL 的 javascript 文件,例如<script src="some/script"></script>。如果 some/script 没有返回有效的 JavaScript,那你就倒霉了。 JSON 不是有效的 JavaScript。服务器必须支持 JSONP。也许有帮助:***.com/q/2067472/218196 和 ***.com/q/3076414/218196。 @PulkitMittal:你有两个选择。 1) 编辑服务器以输出 JSONP 响应(将 JSON 包装在函数调用中,并使用 text/javascript 内容类型),或 2) 向该页面所在的同一服务器发出 JSON (AJAX) 请求,并且使用代理脚本从其他服务器获取 JSON。 【参考方案1】:

使用数据类型:'json'

$.ajax(
 url: getinstruments,
  dataType: 'json',
  success: function(data) 
  alert (data.firstName);

);

【讨论】:

以上是关于当 dataType 设置为 JSONP 时读取 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

关于jQuery.ajax()的jsonp碰上post详解

AJAX中的dataType

使用NODEJS实现JSONP的实例

jQuery使用JSONP实现跨域请求

使用 JQuery Ajax 和 JSONP 调用 OData 服务

jsonp解决跨域问题