4

我需要知道之间的确切区别:

<form method="POST" action="https://mywebsite/signon.php">
<input name="harv_acc" value="940322903" type="hidden" />
<input name="harv_eml" value="a@b.com" type="hidden" />
<input type="submit" value="SignOn" />

var url = "https://mywebsite/signon.php";
$.ajax({
    url: url,
    type: 'POST',
    //dataType: 'html', -- this was something I tried later
    //data: "harv_acc=" + accountnumber + "&harv_eml=" + email , this is also what I tried last but below is what I tried first
    data: { harv_acc: account, harv_eml: email },
    success: function (data) {
        closePopup("div_PleaseWait");
        alert(data);
        //window.location = encodeURI('<%= Url.Action("DownloadDocument", "Documents") %>?DocumentID=' + documentID + '&DownloadType=' + downloadType + '&DownloadPath=' + data);
    }
});

当我发布后者时,我得到 200 但没有回应。如果我提交第一个,我会得到正确的回复。

4

5 回答 5

14

从评论:

我要发布到另一个网站

啊哈!有你的问题。出于安全原因,浏览器会阻止 AJAX 访问外部网站。抱歉,您不会通过 XHR 请求发出该请求。

如果其他网站希望您与他们交流,他们可以通过 JSON-P 公开网站的这一部分,其工作原理如下:

  1. 我的站点添加<script src="http://othersite.com/signon.js?username=foo&password=bar&callback=myCallback">到源代码(是的,为此使用 GET 很麻烦,但 JSON-P 不能以任何其他方式工作),并创建一个名为myCallback处理响应数据的函数。
  2. 另一个站点登录,然后返回类似myCallback({success: false, errorMessage: "Incorrect password, try again!"})
  3. 该脚本在我的网站上运行,调用myCallback,一切都很愉快。

JSON-P 是一个强大的协议,但只有在远程站点同意的情况下才有效。不过,如果他们这样做了,jQuery 有一个很好的快捷方式:只需设置dataType: "jsonp",它就会为您处理整个回调。

但是,如果您没有与该网站密切相关,这不太可能发生,您可能会被迫放弃这种跨站点交互。抱歉,但这种跨域策略对在线安全至关重要。(我不希望其他站点bankofamerica.com代表我发出请求,kthx。)

于 2012-06-29T15:24:44.760 回答
1

传递给您的complete函数的第一个参数将是一个jqXHR对象,它是浏览器XMLHttpRequest对象的包装器。处理响应的更方便的方法是使用done方法:

var url = "https://mywebsite/signon.php";
$.ajax({
    url: url,
    type: 'POST',
    dataType: 'html',
    data: "harv_acc=" + accountnumber + "&harv_eml=" + email
}).done(function(data) {
    closePopup("div_PleaseWait");
    alert(data);
});
于 2012-06-29T15:26:21.170 回答
0

尝试将数据作为 key:value 对象发送。这是来自 jQuery 文档的示例

    $.ajax({
  type: "POST",
  url: "some.php",
  data: { name: "John", location: "Boston" }
}).done(function( msg ) {
  alert( "Data Saved: " + msg );
});

更新:正如用户 Matchu 指出的那样,这不是问题,因为无论如何数据都将转换为查询字符串,如 jQuery 文档中所述:

"data 选项可以包含 key1=value1&key2=value2 形式的查询字符串,也可以包含 {key1: 'value1', key2: 'value2'} 形式的映射。如果使用后一种形式,则转换数据在发送之前使用 jQuery.param() 将其转换为查询字符串。"

所以,是的,我在那里有些轻率的回答。至少学到了一些东西!;)

于 2012-06-29T15:22:27.557 回答
0

浏览器不支持跨域 ajax 请求。但是还有另一种方法可以解决这个问题。

您可以将JSONP用于跨域请求。它易于使用,并允许您从支持回调的任何服务器/脚本请求任何内容(只要是 JSON 格式)。JSONP 的好处是它也适用于旧版浏览器。

唯一严重的限制似乎是它总是使用 HTTP GET 方法

你也可以检查一下吗。

于 2012-06-29T15:32:47.463 回答
-2

使用 POST 方法时,在您的情况下,您应该将数据发布为 JSON

var url = "https://mywebsite/signon.php";
$.ajax({
    url: url,
    type: 'POST',
    dataType: 'html',
    data: {
      harv_acc : accountnumber,
      harv_eml : email
    },
    success: function (data) {
        closePopup("div_PleaseWait");
        alert(data);
        //window.location = encodeURI('<%= Url.Action("DownloadDocument", "Documents") %>?DocumentID=' + documentID + '&DownloadType=' + downloadType + '&DownloadPath=' + data);
    }
});

注意:我使用数据类型:JSON

于 2012-06-29T15:21:04.230 回答