2012-09-13 13 views
22

Una operación bastante típica de CRUD dará como resultado que un objeto tenga su Id establecido una vez que persista.¿Cómo extraigo contenido de HttpResponseMessage de POST cuando uso WEB API?

Así que si tengo el método Post en el controlador que acepta un objeto (JSON serializado, por ejemplo) y devuelve un HttpResponseMessage con HttpStatusCode Created y Content establecido en el mismo objeto con Id actualizado de nulo a entero, ¿cómo puedo hacer? usar HttpClient para obtener ese valor Id?

Probablemente sea bastante simple, pero todo lo que veo es System.Net.Http.StreamContent. ¿Es mejor devolver un Int del método de publicación?

Gracias.

Update (siguiente respuesta):

Un ejemplo de trabajo ...

namespace TryWebAPI.Models { 
    public class YouAreJoking { 
     public int? Id { get; set; } 
     public string ReallyRequiresFourPointFive { get; set; } 
    } 
} 

namespace TryWebAPI.Controllers { 
    public class RyeController : ApiController { 
     public HttpResponseMessage Post([FromBody] YouAreJoking value) { 
      //Patience simulated 
      value.Id = 42; 

      return new HttpResponseMessage(HttpStatusCode.Created) { 
       Content = new ObjectContent<YouAreJoking>(value, 
          new JsonMediaTypeFormatter(), 
          new MediaTypeWithQualityHeaderValue("application/json")) 
      }; 
     } 
    } 
} 

namespace TryWebApiClient { 
    internal class Program { 
     private static void Main(string[] args) { 
      var result = CreateHumour(); 
      Console.WriteLine(result.Id); 
      Console.ReadLine(); 
     } 

     private static YouAreJoking CreateHumour() { 
      var client = new HttpClient(); 
      var pennyDropsFinally = new YouAreJoking { ReallyRequiresFourPointFive = "yes", Id = null }; 

      YouAreJoking iGetItNow = null; 
      var result = client 
       .PostAsJsonAsync("http://localhost:1326/api/rye", pennyDropsFinally) 
       .ContinueWith(x => { 
           var response = x.Result; 
           var getResponseTask = response 
            .Content 
            .ReadAsAsync<YouAreJoking>() 
            .ContinueWith<YouAreJoking>(t => { 
             iGetItNow = t.Result; 
             return iGetItNow; 
            } 
       ); 

       Task.WaitAll(getResponseTask); 
       return x.Result; 
      }); 

      Task.WaitAll(result); 
      return iGetItNow; 
     } 
    } 
} 

Parece Node.js inspirado.

Respuesta

48

Puede utilizar ReadAsAsync<T>

.NET 4 (se puede hacer eso sin continuaciones), así

var resultTask = client.PostAsJsonAsync<MyObject>("http://localhost/api/service",new MyObject()).ContinueWith<HttpResponseMessage>(t => { 
    var response = t.Result; 
    var objectTask = response.Content.ReadAsAsync<MyObject>().ContinueWith<Url>(u => { 
     var myobject = u.Result; 
     //do stuff 
    }); 
}); 

.NET 4,5

var response = await client.PostAsJsonAsync<MyObject>("http://localhost/api/service", new MyObject()); 
    var myobject = await response.Content.ReadAsAsync<MyObject>(); 
+4

De hecho - hay algunas muestras oficiales en CodePlex aquí para .NET 4.0 y 4.5 http://blogs.msdn.com/b/webdev/archive/2012/08/26/asp-net-web-api-and-httpclient-samples.aspx –

+0

Sí. Gracias Mark. Esas muestras eran exactamente lo que estaba buscando. Los perdí de alguna manera. – ofraski

Cuestiones relacionadas