【问题标题】:jQuery Ajax POST unsuccessfuljQuery Ajax POST 不成功
【发布时间】:2011-04-04 22:43:06
【问题描述】:

我无法使用 jquery 的 ajax 功能成功发布。

运行页面的URL是http://localhost:9999,目标(Web服务)的URL是http://localhost:8080。不,端口不一样,它们分别是 9999 和 8080。

下面是 request 和 jquery ajax 代码。

请求:

OPTIONS /profile/set_member HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost:9999
Access-Control-Request-Method: POST

jQuery ajax 代码:

$.ajax({ 
        type: "POST", url: "http://localhost:8080/profile/set_member", 
        contentType: "application/json", data: member, 
        error: function(){ alert('Update failed!'); }, 
        processData: false, 
        success: function(){ alert('Update successful!'); }
});

【问题讨论】:

  • 您是从同一个域发帖的吗?
  • 运行页面的网址是什么?

标签: jquery ajax post


【解决方案1】:

这是跨域 ajax 调用的问题。基本上(至少在 Firefox 中),出于安全原因,POST 请求被转换为 OPTIONS 请求。我昨晚遇到了同样的确切事情,张贴在这里。

WCF Ajax Call not working with Jquery $.ajax

我在 localhost:23485 上对 IIS 中托管的 http://localhost 上的 Web 服务进行了 $.ajax 调用。因为它们是不同的域,所以跨域的介入使事情变得困难。

【讨论】:

  • 一个更令人恼火的症状是 $.ajax 调用在进行这种特定类型的调用时经常会报告成功,即使它实际上并没有工作。
  • 另外,查看您的请求标头,我发现 Origin 和 Host 地址都是 localhost,但来自不同的端口。和我昨晚遇到的一模一样:(。
  • @Dusda:你说得对,这是同样的问题。似乎“唯一”的解决方案是在 ajax 调用和 Web 服务之间建立一个代理。
  • @Mads610,不一定。您可以利用 JSONP 规范:ajaxian.com/archives/jsonp-json-with-padding。我以前做过很多次这项工作。
  • 克里斯是正确的;您可以利用 jsonp 进行跨域调用。只是需要更多的工作。
【解决方案2】:

在您调用 ajax 的同一域上创建代理,例如在 PHP 中:

<?php /* get.php */
    $url = $_GET["Url"];
    echo file_get_contents($url);
?>

进行 ajax 调用:

$.ajax({ url: "get.php?Url=realurl.com" });

这是一种解决方法。

【讨论】:

    【解决方案3】:

    调用什么处理程序? successerror 处理程序?你能详细说明“不起作用”是什么意思吗?

    您可能希望 alert 在您的 error 处理程序中获得更多信息,如下所示:

    error: function(XMLHttpRequest, textStatus, errorThrown) {
       //console.log is better at least for debugging. You can change this back to alert 
       //when your code goes into production
       console.log("Update unsuccessful. Status: ", textStatus, " error thrown: ", errorThrown);
    }
    

    textStatus 应该让您了解问题可能是什么。可能的值是“timeout”、“error”、“notmodified”和“parsererror”。找出实际错误后,请更新问题。

    此外,如果您有 Firebug,请检查 Net 选项卡以查看请求和响应。一些常见的错误来源:

    • 违反同源策略。您不能将 AJAX 设置为与父页面不同的 URL。
    • 服务器端错误。如果您的服务器返回类似 500 的响应代码,则请求将失败。
    • 解析错误。如果您期待特定的响应格式,例如 jsonxml,并且如果响应不是该格式,则 AJAX 请求将不成功。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多