10

我的 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);
        }

    }

从角度来看,我正在尝试读取该 Location 标题,但到目前为止我仍然无法读取。

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));
         };

我只是检查每个的内容,没有一个有位置标题。有没有一种方法可以访问位置标头,以便我知道新对象的 url?

4

2 回答 2

20

根据文档,该headers对象实际上是一个返回标头的函数,如下所示:

.success(function(data, status, headers, config) {
    alert( headers('Location') );
});

如果你想要一个所有标题的集合,你可以这样做:

.success(function(data, status, headers, config) {
    console.log( headers() );
});

注意:如果您的服务器设置了响应代码301or 302,您将无法获取Location标头,因为 XMLHttpRequest 对象将自动且透明地跟在该标头后面。

因此,请确保您正确设置了响应代码。我在 PHP 中进行了测试(我不经常使用它),并且忘记了设置Location标头会自动设置响应代码。为了测试这一点,我不得不使用:

header('Location: blah-blah', true, 200);

这是我的工作代码示例,只需将其保存到location-test.phpPHP 服务器上并运行它:

<?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

}
于 2013-07-27T23:23:20.930 回答
2

由于.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'));
 });
于 2016-12-16T16:30:08.813 回答