50

我发现这个非常有用的 Chrome 扩展名为 Postman。这是一个非常有用的扩展,尤其是在您编写 RESTful 应用程序时。

我感到困惑的一件事是,这个插件/扩展如何能够在不同的域上成功发送 POST 请求?

我尝试像这样使用 Postman 在投票中投票。

使用 Postman 投票

提交后,投票实际上被计算在内,但是当我尝试使用 AJAX 和 JavaScript 时,由于浏览器的来源策略不同,它失败了。

这怎么可能呢?

这是我使用 jQuery 的代码。我在我的电脑上使用了它,localhost。

init: function() {
    $.ajax({
        url: 'http://example.com/vote.php',
        type:'POST',
        dataType: 'html',
        data: {
            id: '1'
        },
        success: function(data) {
        if ( data == 'voted' ) {
            $('.set-result').html( 'you already voted. try again after 24 hours' );
        } else {
            $('.set-result').html( 'successfully voted' );
        }
    }
    });
},
4

4 回答 4

36

Chrome 打包应用可以拥有跨域权限。当您安装 Postman 时,它会提示您此应用程序将访问任何域。

通过放入清单文件*/*permissions部分,您可以做到这一点。

在此处阅读更多信息: https ://developer.chrome.com/extensions/xhr.html

于 2013-04-15T17:48:47.603 回答
18

您可以将以下标头添加到邮递员中发送的 Ajax 请求中。

Content-Type      application/json

X-Requested-With  XMLHttpRequest

截屏

在此处输入图像描述

归功于猎户

于 2017-10-26T13:32:15.477 回答
3

听起来主持投票的站点(“vote.php”脚本)需要设置“Access-Control-Allow-Origin”标头以允许从站点列表(或所有站点)发布。

标头的 * 值将允许从任何网站发布:

Access-Control-Allow-Origin: *

即您可以将以下内容放在 vote.php 的顶部

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

Chrome 扩展程序和应用程序不受与普通网页相同的安全限制。

其他调试提示:

如果您尝试从在浏览器的本地文件系统上打开的网页访问远程服务,您可能会发现您的浏览器对其应用的安全规则与对从 Web 服务提供的文件应用的安全规则不同。

例如,如果您在浏览器中从C:\MyDocuments\weboot\index.htm(Windows) 或(Mac) 等位置打开本地文件,您的 AJAX 请求可能无法正常工作,即使在大多数浏览器中指定了标头。\Users\joe\Sites\index.html

Apple 的 Safari 对本地打开的文件几乎没有跨域限制,但 Firefox 对其允许的内容要严格得多,而 Chrome 则处于中间位置。在本地运行 Web 服务器(例如 on http://localhost/)是避免意外行为的好主意。

此外,提供处理 Ajax 请求的函数的其他库(例如 AngularJS)可能需要默认在服务器上设置其他标头。您通常可以在浏览器调试控制台中看到失败的原因。

于 2014-06-06T00:41:34.220 回答
0

2021 年 10 月

在我的调查中,我发现您需要在请求的标头中添加一个额外的字段。因此,只需将以下键值添加到标题中:

key: X-Requested-With| valueXMLHttpRequest

于 2021-10-12T13:43:11.900 回答