3

我正在调用身份验证服务,在其中执行 $http.post 返回 303 响应,重定向到返回响应的 get 调用。

当我使用 Postman 进行 post 调用时,我得到了所需的响应,但是当我进行有角度的 $http.post 调用时,它返回了一个 401 错误(这是用户未授权)

我在进行角度调用时是否遗漏了什么?后端服务似乎运行良好,因为它在 Postman 上运行良好。

这是 $http 调用的样子:

$http.post(url, userData).success(function(data, status) {
   //handle success
}.error(function(data, status) {
   //handle error   
});

在这种情况下,url 和用户数据的构造非常好。

4

2 回答 2

3

GET接到电话的原因是浏览器在角度到达之前处理了 303 响应。处理顺序是先到浏览器再到 Angular 框架。

简而言之,发生的事情是:您调用服务器->服务器返回 303 响应->您的浏览器处理 303 并向某个url发出请求(应该是响应标头中的“位置”)->服务器接收请求并返回 401 授权响应 --> 再次浏览器首先接收 401 响应,但这一次浏览器将响应重定向到 angular --> 最后您可以在error().

对此的解决方案可能是切换到其他响应状态代码,如 2xx,您可以location从正文中获取。然后您可以手动进行重定向。如果您必须使用 303 或其他 3xx 作为响应代码,我认为目前没有任何有效的解决方案,因为您无法对浏览器做太多事情。据我所知,浏览器级别可能有解决方案,但不知道什么时候会发生。

希望这可以帮助任何有类似问题的人,尽管这个问题提出已经将近一年了。

其他一些参考:https ://groups.google.com/forum/#!topic/angular/GKkdipdMbdo 您可以从上面的链接中看到类似的解决方案。

于 2014-08-14T13:57:57.073 回答
0

我遇到了这个问题,error经过很多小时的努力,我在对象中找到了一个重定向 url。

loginWithLinkedIn() {
    let data = {
        // some kind of information here
    }

    return this.http.get(`https://www.someurl.com/oauth/v2/authorization`).subscribe(res => {
       console.log(res)
    }, err => {
       console.log(err.url) // here is the redirect url
       window.location.href = err.url
    })
}

Note:当您发出请求并收到被视为错误的 303 响应时,这就是我们认为我们收到错误但错误包含有用信息的原因。

于 2020-01-16T14:27:32.533 回答