2017-01-15 25 views
5

Mam jeden api nazywając inny.HttpClient PostAsync posting null content

i oto mój kod, który wydaje się powodować ModelState.IsValid = false po drugiej stronie świata.

var baseUri = new Uri("http://localhost:5001/"): 
_httpClient.BaseAdress = baseUri; 
var data = new StringContent(content: model.Tostring(), 
      encoding: Encoding.UTF8, 
      mediaType: "application/json"); 

var response = await _httpClient.PostAsync("api/product", data); 

oglądania Post([FromBody]Product product) na API nazywany po prostu zobaczyć product=null.

zmiana na Post([FromBody]object product) również pokazuje null.

wywoływanie api z Postman działa idealnie dobrze. które lokalizują mój problem na PostAsync. co się dzieje z moim PostAsync?

Edit:

Wiem, że ludzie mogą sugerować PostAsJsonAsync, ale będę próbować go dopiero wiem w czym problem z PostAsync. :(

+1

jesteś pewien, że 'model.ToString()' produkuje właściwego JSON? A nawet jeśli tak jest, lepiej przynajmniej użyć oddzielnej metody, takiej jak 'ToJsonString' lub nawet nie umieszczać kodu serializacji wewnątrz tej klasy. –

+1

W każdym razie bez [MCVE] nie możemy ci wiele pomóc. –

+0

miejsce na @EugenePodskal. 'model.ToString()' nie robił tego, co myślałem, że robi. zmiana na 'content: JsonConvert.SerializeObject (model)' działa. czy to jest droga? –

Odpowiedz

2

Jak wskazano w uwagach model nie są konwertowane do formatu JSON, kiedy nazywa model.ToString. Jesteś w końcu zorientowali się, że można użyć Json.NET do serializacji modelu do JSON z JsonConvert.SerializeObject(model). To będzie pracować dla szeregowania model JSON.

można pójść o krok dalej i stworzyć metodę rozszerzenia do sprawowania tej funkcji dla Ciebie

public class JSONStringExtension { 
    public static string ToJsonString(this object model) { 
     if(model is string) throw new ArgumentException("mode should not be a string"); 
     return JsonConvert.SerializeObject(model); 
    } 
} 

To będzie teraz pozwalają wywołać metodę modelu i przekształca go do JSON w Twój kod:

var baseUri = new Uri("http://localhost:5001/"): 
_httpClient.BaseAdress = baseUri; 
var data = new StringContent(content: model.ToJsonString(), //<--Extension method here 
      encoding: Encoding.UTF8, 
      mediaType: "application/json"); 

var response = await _httpClient.PostAsync("api/product", data); 

Stosowana często metoda rozszerzenia PostAsJsonAsync wykonuje to samo, co w końcu, poprzez wyodrębnienie kroku serializacji JSON. wewnętrznie wywołuje tę samą metodę PostAsync.

który będzie wyglądał trochę jak ten

public static Task<HttpResponseMessage> PostAsJsonAsync(this HttpClient httpClient, string url, object content) { 
    var json = JsonConvert.SerializeObject(content) 
    var data = new StringContent(content: json, 
       encoding: Encoding.UTF8, 
       mediaType: "application/json"); 
    return httpClient.PostAsync(url, data); 
}