2013-07-27 13 views
10

私のポストメソッドは、このようなものである:角度でanglejsのPOST APIからLocationヘッダーを読み取る方法は?

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

    } 

、私はその場所のヘッダーを読み取るしようとしていますが、これまでのところ、私はまだにできませんよ。

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を知ることができますか?

答えて

18

According to the documentationheadersオブジェクトがそうのように、実際にヘッダを返す関数です:

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

ここに私の作業コードサンプルです、ちょうどPHPサーバー上location-test.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 

} 
+0

これはHTTPを破損しませんか?場所は200年代とは考えられていません。 –

+0

@MikaelÖstbergそれはちょうど良い202と行く。 http://farazdagi.com/blog/2014/rest-long-running-jobs/ –

1

.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')); 
}); 
関連する問題