2016-02-11 31 views
13

Próbuję POST na Web API przy użyciu HttpClient. Kiedy umieściłem punkt przerwania w metodzie Save interfejsu Web API, produkt [FromBody] ma wartość null. Oznacza to, że coś jest nie tak ze sposobem w jaki umieszczam produkt na Web API. Czy ktoś może rzucić okiem na poniższy kod i zobaczyć, gdzie mogę się nie udać. Zakładam, że ma to coś wspólnego z nagłówkami i typami treści.Publikowanie w interfejsie WWW za pomocą metody HttpClient i interfejsu Web API Parametr [FromBody] kończy się jako null

POST połączenia z repozytorium klienckiego API Web, który powinien przekazać produkt sprzeciw poprzez jak JSON:

public async Task<Product> SaveProduct(Product product) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://localhost:99999/"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     StringContent content = new StringContent(JsonConvert.SerializeObject(product)); 
     // HTTP POST 
     HttpResponseMessage response = await client.PostAsync("api/products/save", content); 
     if (response.IsSuccessStatusCode) 
     { 
      string data = await response.Content.ReadAsStringAsync(); 
      product = JsonConvert.DeserializeObject<Product>(data); 
     } 
    } 
    return product; 
} 

Web API metody kontrolera:

[HttpPost] 
[Route("save")] 
public IActionResult Save([FromBody]Product product) 
{ 
    if (customer == null) 
    { 
     return HttpBadRequest(); 
    } 
    _manager.SaveCustomer(product); 
    return CreatedAtRoute("Get", new { controller = "Product", id = product.Id }, product); 
} 

[FromBody] Parametr produktu produktu kończy się wartością null.

+0

Polecam NIE owijania HttpClient w użyciu instrukcji zobaczyć https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Xander

Odpowiedz

22

Czy próbowałeś sprawdzić żądanie w czymś takim jak skrzypek? Potrzebny typ zawartości to aplikacja/json, jak zauważyłeś. Ale ustawiasz tylko nagłówek accept.

Spróbuj:

StringContent content = new StringContent(JsonConvert.SerializeObject(product), Encoding.UTF8, "application/json");