2017-01-15 123 views
5

我有一個API調用另一個。HttpClient PostAsync發佈null內容

這裏是我的代碼,它似乎在世界的另一邊導致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

調用API從Postman完美的作品。其中我的問題本地化到PostAsync。我的PostAsync怎麼回事?

編輯

我知道人們可能會建議PostAsJsonAsync,但我會嘗試後,才知道什麼是與PostAsync問題。 :(

+1

你肯定'model.ToString()'產生正確的JSON?即使是這樣,你最好至少使用一個像ToJsonString這樣的單獨的方法,或者甚至不要將序列化代碼放在該類中。 –

+1

無論如何,沒有[MCVE]我們都無法幫到你。 –

+0

@EugenePodskal。 'model.ToString()'沒有做我認爲正在做的事情。更改爲'content:JsonConvert.SerializeObject(model)'作品。這是一種方式嗎? –

回答

2

正如model沒有被轉換成JSON當你叫model.ToString的評論表示您最終想通了,你可以用Json.Net序列化模型JSON與JsonConvert.SerializeObject(model),這將序列化工作模型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); 
}