Как прочитать заголовок местоположения из 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'));
 });