jQuery .post工作但触发.fail没有任何信息

时间:2015-06-13 05:10:17

标签: javascript jquery json cross-domain .post

我已成功发布数据,但我没有运气让我的.post响应处理程序代码正常运行。我在尝试的不同浏览器/工具中获得了不一致的结果。这是邮政编码:

$.post(form.attr("action"), form.serialize(), "json")
   .done(function (response, textStatus, jqXHR) {
      alert('done');
   })
   .fail(function (jqXHR, textStatus, errorThrown) {
      // log the error to the console
      alert('responsetext:' + jqXHR.responseText + ', status:' + textStatus + ', error:' + errorThrown);
   })

在FireFox和Chrome中,它总是转到.fail(即使数据成功发布),但唯一的项目集是textStatus到“error”。在Firefox中,当我尝试查看响应时,它只显示错误,“SyntaxError:JSON.parse:第1行第1列意外的数据结束”。在Chrome中,在控制台中我看到:“XMLHttpRequest无法加载http://example.net/applicationsvc/formprocessor/index.php。请求的资源上没有”Access-Control-Allow-Origin“标头。因此,”http://example.net“来源是不允许访问。“这似乎非常相关,但我尝试解决它并没有奏效。

如何解决.post中的Access-Control-Allow-Origin问题?为什么我没有收到任何错误数据?为什么FireFox无法解析响应。

使用PostMan,并使用相同的标题和正文,我确实看到我的回复:

{"successful":true,"thankyou_message":"<h2>Thank you!<\/h2><p>Thank you for signing up!<\/p>"}

但是代码似乎没有得到或处理它。

以下是要发出的请求标头:

Host: example.net
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://example.net/mypage.htm
Content-Length: 655
Origin: http://example.net
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

更新: 我现在已经从.post切换到.ajax

$.ajax({
    url: form.attr("action"),
    type: "POST",
    data: form.serialize(),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function () {
        alert('done');
    }
});

我得到了一致的HTTP 501响应。

2 个答案:

答案 0 :(得分:0)

如果您使用跨域,请尝试使用JSONP instea

您的代码

$.ajax({
     url: form.attr("action"),
     method: "POST",
     headers: {"Access-Control-Allow-Origin":"*"},
     data: form.serialize(),
     dataType: "json",
     contentType: "application/json; charset=utf-8",
     success: function () {
         alert('done');
     }
});

将其更改为

$.ajax({
    url: form.attr("action"),
    type: "POST",
    headers: {"Access-Control-Allow-Origin":"*"},
    data: form.serialize(),
    dataType: "jsonp",
    contentType: "application/json; charset=utf-8",
    success: function () {
        alert('done');
    }
});

答案 1 :(得分:0)

尝试在服务器上启用跨源,例如php

header("Access-Control-Allow-Origin: *");

服务器必须在响应标头中发送此信息,出于安全原因,请相应地将星标更改为您的域。