问题描述
我的 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() );
});
注意:如果您的服务器设置了301
或302
的响应码,您将不能够获取 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 标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!