如何从 angularjs 中的 POST API 读取 Location 标头? [英] How to read the Location header from a POST API in angularjs?

查看:19
本文介绍了如何从 angularjs 中的 POST API 读取 Location 标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的 post 方法是这样的:

My post method is something like this:

    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 中,我正在尝试读取 Location 标头,但到目前为止我仍然无法读取.

In angular, I am trying to read that Location header but so far I'm still not able to.

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?

I am just checking out the contents of each of those and none has the location header. Is there a way in angular to access the location header so that i know the url of my new object?

推荐答案

根据文档headers对象其实是一个返回header的函数,像这样:

According to the documentation, the headers object is actually a function that returns the header, like so:

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

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

If you want a collection of all headers, you can do this:

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

注意:如果您的服务器设置了301302的响应码,您将能够获取 Location 标头,因为 XMLHttpRequest 对象将自动透明地跟随它.

Note: If your server sets a response code of 301 or 302, you will not be able to get the Location header, as it will be automatically and transparently followed by the XMLHttpRequest object.

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

So, make sure you are correctly setting the response code. I was testing this in PHP (which I don't use as much), and had forgotten that setting a Location header automatically set the response code. To test this, I had to use:

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

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

Here's my working code sample, just save it to location-test.php on a PHP server and run it:

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

}

这篇关于如何从 angularjs 中的 POST API 读取 Location 标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆