2017-01-15 127 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); 
}