工作$ .ajax调用的AngularJS $ http.post版本返回401 UNAUTHORIZED

时间:2015-10-02 06:32:03

标签: javascript ajax angularjs http-headers

我正在尝试重写一个工作的$ .ajax服务器调用以使用AngularJS $ http.put。 $ http版本返回401未授权。

我正在重写的ajax调用如下所示:

$.ajax({
	url: domain + "/api/v1/user/logout/",
	timeout: 10000,
	type: "POST",
	contentType: "application/json",
	beforeSend: function(xhr) {xhr.setRequestHeader("Authorization", api_user())},
	success: function(data) {
		if (data.success) {
			notify("Thanks for signing out");
							
		}
	}
});

我写的AngularJS等价物看起来像这样:

logoutUser: function() {
   var config = {headers:  {
        'Authorization': api_user()
      }
   };
   return $http.post(apiDomain + '/api/v1/user/logout/', config).then(function(response)    {
       return response;
   });
}

当这个运行时,服务器返回一个未授权的401,并且没有输入$ http.post的'then'部分。

编辑:更多信息

使用firebug,它说请求标头是:

POST /api/v1/user/logout/ HTTP/1.1

Host: localhost:8000

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0

Accept: application/json, text/plain, */*

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate

Content-Type: application/json;charset=utf-8

Referer: http://localhost:8100/

Content-Length: 40

Origin: http://localhost:8100

X-Forwarded-For: 12.13.14.15

Connection: keep-alive

Pragma: no-cache

Cache-Control: no-cache

根据Firebug的说法,POST来源是:

{"headers":{"Authorization":"ApiKey bill:bfab6e5a1fb6e4e405756dcf14a634e86ba05c7b"}}

这是否意味着授权作为数据而不是标题发送?

3 个答案:

答案 0 :(得分:1)

您必须添加错误功能以处理401响应。

检查以下示例代码以添加错误回调函数

// Simple GET request example:
$http({
  method: 'GET',
  url: '/someUrl'
}).then(function successCallback(response) {
    // this callback will be called asynchronously
    // when the response is available
  }, function errorCallback(response) {
    // called asynchronously if an error occurs
    // or server returns response with an error status.
});

答案 1 :(得分:0)

根据您要访问的API /服务器端点,它们并非都授权来自前端的呼叫。 Steam社区市场(https://developer.valvesoftware.com/wiki/Steam_Web_API/Feedback)是一个例子,我发现角度前端呼叫根本没有被授权。我不得不从后端进行http调用并提供给前端。

答案 2 :(得分:0)

第二个参数是您要发送的数据。配置是第三个。

@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart activePart)
{
  ... handler code
}