Postman 如何发送请求? ajax,同源策略

Posted

技术标签:

【中文标题】Postman 如何发送请求? ajax,同源策略【英文标题】:how Postman send requests? ajax, same origin policy 【发布时间】:2013-04-07 22:29:22 【问题描述】:

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

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

我尝试像这样使用 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' );
        
    
    );
,

【问题讨论】:

看起来好像扩展通过发布到 getpostman.com 而不是您的目标域(使用 CORS)来工作,然后 getpostman.com 的服务器发出请求并返回响应。 github.com/a85/POSTMan-Chrome-Extension/blob/master/chrome/js/… 这似乎是合法的,然后我会通读他们的代码,我可能会尝试提出相同的解决方案。 但是请注意,要在 IE 中实现 CORS,您必须通过包含替代传输来更改 jQuery。 IE7 根本不支持 CORS。 没问题.. @KevinB,不正确。当我测试显然无法从 gepostman.com 的服务器访问的本地服务器时,它可以工作。 【参考方案1】:

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

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

在这里阅读更多: https://developer.chrome.com/extensions/xhr.html

【讨论】:

怎么可能?网站本身是否也必须允许CORS @Imray 不需要 CORS 标头,就像服务器程序或 curl 所以基本上,Chrome 应用程序不受跨域安全性约束?所以 Chrome 应用可以访问我的银行 cookie 或我的 Facebook 登录信息? @Imray Chrome 应用程序可以绕过跨域。 Chrome 不会在获得此权限后共享您的常规浏览会话。但是,如果您安装了可以执行内容脚本的 Chrome 扩展程序,请确保他们可以访问您的银行 cookie! @Imray,显然,如果你点击“允许这个”和“允许那个”,应用程序可以在你允许的权限范围内做它想做的任何事情。【参考方案2】:

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

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

Access-Control-Allow-Origin: *

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

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

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

其他调试提示:

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

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

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

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

【讨论】:

【参考方案3】:

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

Content-Type      application/json

X-Requested-With  XMLHttpRequest

截图

贷记Orion

【讨论】:

【参考方案4】:

2021 年 10 月

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

键: X-Requested-With | XMLHttpRequest

【讨论】:

以上是关于Postman 如何发送请求? ajax,同源策略的主要内容,如果未能解决你的问题,请参考以下文章

同源策略与CORS

Ajax 跨域请求被阻止:同源策略不允许读取远程资源

Springboot如何优雅的解决ajax+自定义headers的跨域请求[转]

Ajax

跨域AJAX

处理跨域: