带有ajax请求的空响应主体

时间:2014-04-13 14:55:08

标签: javascript ajax google-chrome tornado

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

这适用于普通的Web客户端,但是当我尝试使用ajax时,响应正文为空。由于某些原因,Chrome会在请求完成之前取消请求,并且即使收到200状态,Firefox也会以红色突出显示该请求。我正试图找出正在发生的事情。

我已经设置了CORS标头,我可以看到OPTIONS请求返回有效数据(chrome不会抱怨它)。

这是我的龙卷风服务器:

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中,它会立即输入错误回调,并且请求在开发工具的网络选项卡中标记为“待定”,然后“已取消”。

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

1 个答案:

答案 0 :(得分:1)

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