AngularJS 1.2.14 $ http POST错误响应正文空

时间:2014-03-19 02:02:32

标签: javascript angularjs cors playframework-2.2 angular-http

3月21日更新 经过更多调查后,看起来这也显示一个Play框架错误对错误状态的XHR限制: Play 2.2.1 SimpleResult 4xx Response Body Possible via CORS XHR?使用401代码,或者我寻求的RESTfulness是不可能的。

两个空格中仍然存在问题,因为401在Angular $ http中获得0状态代码,如下所示。 RESTful这么多!我想做的就是为401 Unauthorized提供响应机构。从W3C page on 4xx:"用户代理应该向用户显示任何包含的实体。"

3月20日更新

进一步调查指出XMLHttpRequest本身存在的问题,但如果我遗漏了以下内容,请告诉我。我在xhr.onreadystatechange()回调中吐出原始XHR对象,如Angular的createHttpBackend()中所定义的那样:

angular source mod to console

当我使用已知的良好电子邮件和密码登录时,一切正常:

200 OK with response JSON

但400 Bad Request(错误密码)的相同XHR对象有一个空响应,但更重要的是status = 0,来自Mozilla docs表示请求从未发送过(但我看到我的API服务器获取请求,进行数据库查找,如邮差如上所述):

enter image description here

是什么给出的? Postman如何获​​得响应,但最新的Chrome和Firefox上的XMLHttpRequest被混淆了?

我正在使用$ http发送POST请求,并在浏览器(Chrome和FF)和Postman中收到冲突的响应。邮差工作得很好,有身体,但它看起来像有角度的"清洁"当模板被缓存时,一些响应代码可以处理Android浏览器上的怪异,但是我无法在$ httpBackend中找到原始XHR发生的位置来拦截响应主体 - 也许是因为XHR阻止/取消响应?因为安全吗?我也没有任何拦截器。

快乐的道路"登录工作正常,我在控制台/ firebug中得到200 OK响应,但400 Bad Request没有响应正文。

CORS在nginx上配置(请参阅http://enable-cors.org/server_nginx.html),由于快乐登录成功,因此设置功能正常。

我的电话:

var onLoginSuccess = function(data, status, headers, config){
  console.log('[onLoginSuccess]')
  console.log(data)
  console.log(status)
  console.log(headers)
  console.log(config)
}

var onLoginError = function(data, status, headers, config){
  console.log('[onLoginError]')
  console.log(data)
  console.log(status)
  console.log(headers)
  console.log(config)
}

var loginObj = {
  'username':   $scope.username,
  'password':   $scope.password,
  'grant_type': 'password',
  'client_id':  'web'
}

var doLogin = $http({
  method: 'POST',
  url: 'https://api/v1/token',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  transformRequest: function(obj) {
    var str = [];
    for(var p in obj) {
      str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p]));
    }
    return str.join('&');
  },
  data: loginObj,
  responseType: 'json'
})

doLogin.then(
  onLoginSuccess,
  onLoginError
)

Angular正在修改错误代码,因此浏览器和角度不同意:

angular modifies http codes from XHR response

当我通过Postman发送相同的请求时,400 Bad Request代码是相同的,但正如预期的那样,正文也是一个json字符串。

为什么这不能通过onLoginError()回调中的$ http CORS获得?

postman works fine

2 个答案:

答案 0 :(得分:0)

我认为问题是你将POST主体作为JSON发送,而是需要作为查询参数发送。试试这个改变

var loginObj = $.param({
  'username':   $scope.username,
  'password':   $scope.password,
  'grant_type': 'password',
  'client_id':  'web'
});

这将使您的身体成为查询参数。另外,不要忘记包含jquery.js

答案 1 :(得分:0)

问题最终出现在我的api服务器代码中。我的应用程序只发送了Content-Type标题,但我认为nginx可以提供Allow-Origin标题并让应用程序不知道任何标题。

请参阅Play 2.2.1 SimpleResult 4xx Response Body Possible via CORS XHR?了解答案。 Play Scala .withHeaders()部分通过CORS解决了这个问题。

不知道是否有办法让nginx处理所有标题,也许我的proxy_pass部分没有正确完成。