2013-07-27 19 views
10

Il mio metodo post è qualcosa di simile:Come leggere l'intestazione Location da un'API POST in angularjs?

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

    } 

In angolare, sto cercando di leggere quel colpo di testa Località ma finora non sono ancora in grado di.

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

Sto solo verificando il contenuto di ognuno di questi e nessuno ha l'intestazione di posizione. C'è un modo angolare per accedere all'intestazione della posizione in modo che conosca l'url del mio nuovo oggetto?

risposta

18

According to the documentation, l'oggetto headers è in realtà una funzione che restituisce l'intestazione, in questo modo:

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

Se si desidera una raccolta di tutte le intestazioni, si può fare questo:

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

Nota: Se il server imposta un codice di risposta di 301 o 302, sarà non essere in grado per ottenere l'intestazione Location, poiché verrà seguita automaticamente e in modo trasparente dall'oggetto XMLHttpRequest.

Quindi, assicurarsi di aver impostato correttamente il codice di risposta. Stavo testando questo in PHP (che non uso tanto) e ho dimenticato che l'impostazione di un'intestazione Location imposta automaticamente il codice di risposta. Per verificare ciò, ho dovuto usare:

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

Ecco il mio esempio di codice di lavoro, basta salvarlo location-test.php su un server PHP ed eseguirlo:

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

Questo non interrompe HTTP? La posizione non dovrebbe andare con 200's. –

+0

@ MikaelÖstberg va con 202s bene. http://farazdagi.com/blog/2014/rest-long-running-jobs/ –

1

Dal .success() è deprecato in $ http e è stato sostituito con .then() l'aggiornamento a questa risposta è di chiamare header direttamente sulla risposta che è stata iniettata nella promessa.

$http.post('http://localhost:30028/api/values/adduser', user) 
    .then(function (response) { 
     alert(angular.toJson(response.headers)); 
     //or 
     alert(response.headers('Location')); 
});