从 Chrome 扩展程序到 App Engine 的 POST 请求作为 GET 请求接收

Posted

技术标签:

【中文标题】从 Chrome 扩展程序到 App Engine 的 POST 请求作为 GET 请求接收【英文标题】:POST request from Chrome Extension to App Engine received as GET request 【发布时间】:2014-10-14 14:09:34 【问题描述】:

我正在尝试从 Chrome 扩展程序向使用 Google App Engine 托管的服务器发送一个最小的 POST 请求。这是我的服务器代码:

class Receive(webapp2.RequestHandler):
    def get(self):
        logging.info('received a get')

    def post(self):
        logging.info('received a post')

这是我的 Chrome 扩展程序中的 javascript 代码:

$.post("http://perativ.com/receive");

$.ajax(
    type: "POST",
    dataType: "JSON",
    url: "http://perativ.com/receive"
);

var xhr = new XMLHttpRequest();
xhr.open("POST", "http://perativ.com/receive");
xhr.send();

我的manifest.json 文件中有<all_urls> 权限。

我包含了三个相同的请求,以表明没有任何效果。当我运行这个 Chrome 扩展程序然后检查 perativ.com 上的服务器日志时,我得到三行内容:“received a get”。

感谢所有帮助,谢谢!

【问题讨论】:

【参考方案1】:

正如您通过以下命令所见,对您网站的请求正在使用 HTTP 状态代码 301 从 perativ.com 重定向到 www.perativ.com。发生此重定向时,POST 将转换为 GET。

要解决此问题,请将请求发送到 www.perativ.com 而不是 perativ.com,或者在您可以访问的情况下禁用重定向。

$ curl -X POST http://perativ.com/receive -H 'Content-Length: 0'
<html><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.perativ.com/receive">here</A>.
</BODY></HTML>

【讨论】:

感谢您的回复!不幸的是,我尝试将“perativ.com/receive”的所有实例更改为“www.perativ.com/receive”,但我仍然遇到同样的问题。 @Site 替换 URL 后您是否重新加载了您的扩展程序?你刚才描述的听起来是不可能的。 啊不,就是这样!你完全正确地切换到“www”。我不知道重定向会将 POST 转换为 GET。非常感谢! 仅供参考,如果您想在保留 HTTP 方法的同时进行重定向,请使用 307 或 308 HTTP 状态代码(但不支持 308 和 307)。

以上是关于从 Chrome 扩展程序到 App Engine 的 POST 请求作为 GET 请求接收的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine 自动缩放如何工作?

如何将 blob 从 Chrome 扩展程序传递到 Chrome 应用程序

从Chrome扩展程序检查网站上的Facebook登录

将 Google App Engine 应用程序从 Django 0.96 迁移到 Django 1.2

从 App Engine Flex 切换到 Standard

处理从App Engine标准环境到Cloud SQL的每个应用程序实例的60个并发连接限制的最佳方法?