2014-03-19 70 views
1

UPDATE年03月21 經過調查,它看起來像這也顯示 一個遊戲框架錯誤 上錯誤狀態的XHR限制: Play 2.2.1 SimpleResult 4xx Response Body Possible via CORS XHR?那個或RESTfulness我尋求是不可能的401代碼。

由於401在Angular $ http中獲得0狀態碼,所以在這兩個空間中仍然存在問題,如下所示。非常適合RESTfulness!我想要做的就是爲401 Unauthorized提供一個響應主體。從W3C page on 4xx:「用戶代理應該向用戶顯示任何包含的實體。」

UPDATE年03月20

進一步調查點內的XM​​LHttpRequest本身的問題,但請讓我知道如果我下面失去了一些東西。我吐出原始XHR對象xhr.onreadystatechange()回調裏面的角的createHttpBackend()中定義:

angular source mod to console

當我與一個已知良好的電子郵件和密碼登錄,一切工作正常:

200 OK with response JSON

但是,對於一個400錯誤請求(密碼錯誤)相同XHR對象有一個空的反應,但更重要的是狀態= 0,從Mozilla的文檔表示請求從未發送(但我看到我的API服務器獲取請求並執行數據庫查找,如Postma ñ工程如上):

enter image description here

是怎麼回事? Postman如何得到響應,但最新的Chrome和Firefox上的XMLHttpRequest混淆了?

我使用$ http發送POST請求,並在瀏覽器(Chrome和FF)和Postman中獲得衝突響應。郵差工作正常,並有身體,但它看起來像角是「清理」了一些響應代碼,以處理模板緩存時在Android瀏覽器中的怪異,但我無法確定$ httpBackend中原始XHR發生的位置攔截響應主體 - 也許這是因爲XHR阻止/取消響應?因爲安全?我也沒有任何攔截器。

「開心路徑」登錄工作正常,我在控制檯/螢火蟲中匹配200 OK響應,但400錯誤請求沒有響應主體。

在nginx上配置CORS(請參閱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 modifies http codes from XHR response

當我通過郵差發送相同的請求,400錯誤請求代碼是相同的,但正如預期的那樣,主體也是一個json字符串。

爲什麼通過onLoginError()回調中的$ http CORS不可用?

postman works fine

+0

可能與[與401響應有關的此問題](https://github.com/angular/angular.js/issues/2609)有關,我也遇到過這個問題。 – sinelaw

回答

0

我覺得是您發送POST身體JSON,而是需要發送的查詢參數的問題。試試這個改變

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

這會讓你的身體成爲查詢參數。另外不要忘記包括jquery.js

+1

transformRequest已經做到了,不需要使用jQuery。 – Brian

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部分做得不對。