javascript - 带有 ajax 请求的空响应正文

标签 javascript ajax google-chrome tornado

我正在向 Tornado 服务器发布用户名和密码。如果凭据有效,它会返回一个 cookie 和一个简单的“OK”文本响应。

这适用于普通的 Web 客户端,但是当我尝试使用 ajax 时,响应主体是空的。 Chrome 出于某种原因在完成之前取消了请求,而 firefox 将其突出显示为红色,即使它收到 200 状态。我正在尝试弄清楚发生了什么。

我已经设置了 CORS header ,我可以看到 OPTIONS 请求正在返回有效数据(chrome 不会提示它)。

这是我的 Tornado 服务器:

class LoginHandler(BaseMixin, tornado.web.RequestHandler):
    @gen.coroutine
    def options(self, *args, **kwargs):
        """
        Return CORS headers
        """
        self.set_header('Access-Control-Allow-Headers', 'origin, content-type, accept, authorization')
        self.set_header('Access-Control-Allow-Max-Age', 21600)
        self.set_header('Access-Control-Allow-Methods', 'HEAD, OPTIONS, GET, POST')
        self.set_header('Access-Control-Allow-Origin', '*')

    @gen.coroutine
    def post(self, *args, **kwargs):
        """
        Validates the user's ID and token
        """
        try:
            # ... perform checks - all OK, so then:
            self.set_secure_cookie(
                    "auth", urllib.urlencode({'user_id': self.user_id,
                                              'token': user['token']}))
            self.set_header("Content-Type", "text/plain")
            self.finish("OK")
            return

内容长度设置正确,但由于某些原因,firefox 或 chrome 均未显示响应正文。

我假设这在某种程度上与 CORS 相关,因为我的行为测试都通过了这个端点(并且他们断言响应正文包含“OK”)。

我发出请求(使用 angularjs)如下:

postData = new Array('user_id=' + id, 'token=' + token);

$http.post(url, postData.join('&'), {headers: {'Content-type': 'application/x-www-form-urlencoded'}})
   .success(authSuccessHandler)
   .error(authErrorHandler);

在 chrome 中,它会立即进入错误回调,并且请求在开发工具的网络选项卡中被标记为“待定”然后“已取消”。

有人知道我做错了什么吗?

最佳答案

问题是 CORS header 仅在 OPTIONS 端点上,而不在 POST 上。我也将它们添加到 POST,现在一切正常。

关于javascript - 带有 ajax 请求的空响应正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23044238/

相关文章:

javascript - 将 javascript 对象变量从一个 HTML 页面传递到另一个 HTML 页面

javascript - 响应偏移

javascript - 检查一个 ajax 调用是否正在进行中,以便我不会触发另一个调用

javascript - jQuery 代码适用于 Chrome,不适用于 IE9

javascript - e 在 react js 组件中未定义

Javascript 获取表单文本框中的值

javascript - 将 javascript 的值(value)转化为速度

java - 如何在不使用ajax刷新页面的情况下显示从数据库到jsp的值

javascript - 如何制作非显示输入或其标签 `keyboard tab stoppable` ?

android - 为什么 Chrome 与 Windows 10 上安装的 Android 文件系统的交互方式不同?