簡體   English   中英

HttpClient PostAsync發布空內容

[英]HttpClient PostAsync posting null content

我有一個API調用另一個。

這是我的代碼,似乎在世界的另一端導致ModelState.IsValid = false

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

在被稱為api上觀看Post([FromBody]Product product)我只看到product=null

更改為Post([FromBody]object product)也顯示null

Postman調用api可以正常工作。 這將我的問題本地化為PostAsync 我的PostAsync怎么了?

編輯

我知道人們可能會建議PostAsJsonAsync ,但是只有在知道PostAsync什么問題之后,我才會嘗試。 :(

如注釋中所述,當您調用model.ToString時,該model未轉換為JSON。 最終您發現可以使用Json.Net通過JsonConvert.SerializeObject(model)將模型序列化為JSON。 這將用於將模型序列化為JSON。

您可以更進一步,並創建擴展方法來為您執行該功能

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

現在,這將允許您在模型上調用方法並將其隱式轉換為代碼中的JSON。

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

經常使用的PostAsJsonAsync擴展方法通過為您抽象JSON序列化步驟,基本上完成了您最終實現的功能。 在內部,它正在調用相同的PostAsync方法。

看起來像這樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM