Как прочитать заголовок местоположения из POST API в angularjs?
мой метод post выглядит примерно так:
public HttpResponseMessage AddUser(User user)
{
UserManager userManager = new UserManager();
try
{
userManager.Create(user);
var savedUser = userManager.FindUserByClientId(user.ClientId);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, user);
response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = savedUser.Id }));
return response;
}
catch(Exception ex)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
}
}
в angular я пытаюсь прочитать этот заголовок местоположения, но до сих пор я все еще не могу.
return $http.post('http://localhost:30028/api/values/adduser', user)
.success(function (data, status, headers, config) {
alert(angular.toJson(data));
alert(angular.toJson(status));
alert(angular.toJson(headers));
alert(angular.toJson(config));
};
Я просто проверяю содержимое каждого из них, и ни у одного нет заголовка местоположения. Есть ли способ в angular получить доступ к заголовку местоположения, чтобы я знал url-адрес моего нового объекта?
2 ответов
согласно документации, the headers
объект на самом деле является функцией, которая возвращает заголовок, например:
.success(function(data, status, headers, config) {
alert( headers('Location') );
});
если вы хотите коллекцию всех заголовков, вы можете сделать это:
.success(function(data, status, headers, config) {
console.log( headers() );
});
Примечание: если ваш сервер устанавливает код ответа 301
или 302
, вы не быть в состоянии получить Location
заголовок, так как он будет автоматически и прозрачно сопровождаться XMLHttpRequest объект.
Итак, убедитесь, что вы правильно задаете код ответа. Я тестировал это в PHP (который я не использую так много), и забыл, что установка Location
заголовок автоматически устанавливает код ответа. Чтобы проверить это, мне пришлось использовать:
header('Location: blah-blah', true, 200);
вот мой пример кода, просто сохраните его в location-test.php
на PHP-сервере и запустите его:
<?php
if(isset($_GET['q'])) {
header('Content-Type: application/json');
header('Location: user/1', true, 200);
echo json_encode(array('query' => $_GET['q']));
} else {
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.5/angular.min.js'></script>
<script type='text/javascript'>//<![CDATA[
angular.module('myApp', [])
.controller("myController", function($scope, $http) {
$scope.loc = "Loading...";
$http.get('location.php?q=hello')
.success(function (data, status, header, config) {
console.log(header());
$scope.loc = header('Location');
})
.error(function(data, status) {
console.log((data || 'Req Failed') + ': ' + status);
});
});
//]]></script>
</head>
<body>
<div ng-app="myApp" ng-controller="myController">
Location Header: {{loc}}
</div>
</body>
</html>
<?php
}
С .success()
устарел в $http и был заменен на .then()
обновление к этому ответу, чтобы позвонить header
сразу на ответе который впрыснут в обещание.
$http.post('http://localhost:30028/api/values/adduser', user)
.then(function (response) {
alert(angular.toJson(response.headers));
//or
alert(response.headers('Location'));
});