将 JSON 数据发布到返回状态代码 0 的 API

Posted

技术标签:

【中文标题】将 JSON 数据发布到返回状态代码 0 的 API【英文标题】:Posting JSON data to an API returning status code 0 【发布时间】:2016-01-24 08:26:40 【问题描述】:

我正在尝试将 json 数据发送到 API,但它返回状态代码 0。我在控制台中收到此错误消息:“跨源请求被阻止:同源策略不允许在 asm-resumator 读取远程资源.azurewebsites.net/resumes。(原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。”

您能否指出我的以下代码有什么问题或遗漏:

var candidate= name :"Wedad",email:"myemail", phoneNumber:"1234567", resume:"myresume"
;
        $.ajax(
            type: "POST",
            data :JSON.stringify(candidate),
            url: "url",
            dataType: 'json',
        success: function (data) 
                alert(data);
                ,
        error: function (jqXHR, exception) 
    var msg = '';
    if (jqXHR.status === 0) 
        msg = 'Not connect.\n Verify Network.';
     else if (jqXHR.status == 404) 
        msg = 'Requested page not found. [404]';
     else if (jqXHR.status == 500) 
        msg = 'Internal Server Error [500].';
     else if (exception === 'parsererror') 
        msg = 'Requested JSON parse failed.';
     else if (exception === 'timeout') 
        msg = 'Time out error.';
     else if (exception === 'abort') 
        msg = 'Ajax request aborted.';
     else 
        msg = 'Uncaught Error.\n' + jqXHR.responseText;
    
    alert(msg);

        );

【问题讨论】:

控制台是否显示错误? ***.com/a/2016085/1541563 jQuery Ajax - Status Code 0?的可能重复 【参考方案1】:

没有 HTTP 状态代码 0。您看到的是您正在使用的 API/库返回的 0。您将不得不为此检查文档。 Source

【讨论】:

【参考方案2】:

正如this article 详细解释的那样,当您从与页面不同的域请求资源时,会发出 CORS(http 访问控制的跨域共享标准)请求。

出于安全原因,浏览器会限制从脚本中发起的跨域 HTTP 请求。

现代浏览器处理跨域共享的客户端组件,包括标头和策略实施。但是这个新标准意味着服务器必须处理新的请求和响应标头。

现在,假设服务器有正确的跨域头,jQuery ajax 有一个option 来设置请求中正确的头:

如果您希望在同一域上强制执行跨域请求(例如 JSONP),请将 crossDomain 的值设置为 true。

那么,试试吧:

$.ajax(
  type: "POST",
  crossDomain: true, // <= here
  data: candidate, // no need to stringify the data, jquery does it for you
  url: url,
  success: function(data) 
    alert(data);
  , 
  error: function(error)
    console.log(error);
  
);

如果错误仍然存​​在,可能是服务器没有遵循CORS标准,所以没有解决办法。

更多示例和阅读:http://zinoui.com/blog/cross-domain-ajax-request


只是为了了解一下,Chrome 和其他浏览器通常会执行飞行前请求。简而言之,他们向服务器发送第一个请求,以了解跨源请求允许使用哪种方法。

【讨论】:

对不起。我忘了提到我在控制台中收到此错误消息:“跨域请求被阻止:同源策略不允许读取asm-resumator.azurewebsites.net/resumes 的远程资源。(原因:CORS 标头 'Access-Control-Allow-Origin' 缺失)。” asm-resumator.azurewebsites.net/resumes:找不到 404。你能给我你使用的确切网址吗? 这是我使用的确切网址asm-resumator.azurewebsites.net/resumes。我添加了 crossDomain: true,但我仍然收到相同的错误消息“跨域请求被阻止:同源策略不允许读取asm-resumator.azurewebsites.net/resumes 的远程资源。(原因:CORS 标头 'Access-Control-Allow-Origin' 缺失)。”那么这意味着另一端的服务器没有遵循CORS标准? 是的,好像是这样。所以基本上,你什么都做不了。奇怪的是,我在关注这个网址时找不到 404 ... 我也一样。我会回复给我网址的人。谢谢!【参考方案3】:

您可以使用 html 表单轻松发送。

<form enctype="application/json" action="url" method="post">
    <input name="name">
    <input name="email">
    <input name="phoneNumber">
    <input name="resume">
    <input type="submit" name="send" value="Send">
</form>

【讨论】:

以上是关于将 JSON 数据发布到返回状态代码 0 的 API的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 请求循环到后端(REST API)

如何确定脚本是否返回退出状态代码1或0

AngularJS $http 获取返回空状态 0

将检索到的对象推送到 React 中的状态只会给我带来最后一个

如何将数据库对象序列化/表示为节点中 API 返回的 JSON

JSON 响应 Ajax 调用的正确状态代码?