2017-01-15 15 views
5

私は別のAPIを呼び出すことがあります。HttpClient PostAsync投稿nullコンテンツ

ここでは、世界の反対側のModelState.IsValid = falseが原因と思われるコードです。 APIのPost([FromBody]Product product)を見

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

は、私はちょうど product=nullを参照してくださいと呼ばれています。

Post([FromBody]object product)に変更すると、nullと表示されます。

Postmanからapiを呼び出しても問題ありません。私の問題はPostAsyncにローカライズされています。私のPostAsyncで何が起こっていますか?

編集

私は人々がPostAsJsonAsyncを示唆するかもしれないけど、私は私がPostAsyncに問題が何を知った後にのみ、それを試してみましょう。 :(

+1

あなたは 'model.ToString()'適切なJSONを生成していることを確認しているように少しになります

?そして、たとえそれがあっても、少なくともToJsonStringのような別のメソッドを使うことをお勧めします。あるいは、そのクラスの中にシリアライゼーションコードを入れないことさえあります。 –

+1

いずれにしても[MCVE]がなければ、お手伝いできません。 @EugenePodskalの –

+0

スポット。 'model.ToString()'は私が思っていたことをしていませんでした。 'content:JsonConvert.SerializeObject(model)'に変更されました。それは行く方法ですか? –

答えて

2

あなたがmodel.ToStringを呼び出したときにmodelをJSONに変換されていませんでしたコメントで示されているように。あなたは最終的にあなたがJsonConvert.SerializeObject(model)とJSONにモデルをシリアライズするJson.Netを使用できることを考え出した。これは、シリアル化のために動作します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); 
    } 
} 

ためにその機能を実行するために拡張メソッドを作成することができますあなたのコード。

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

頻繁に使用される拡張メソッドは、基本的に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); 
} 
関連する問題