2017-01-15 3 views
5

하나의 API에서 다른 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에 문제가 어떤 건지 후에 그것을 시도 할 것이다. :(당신이 model.ToString라고 할 때 model이 JSON으로 변환되는되지 않은 코멘트에 나타난 바와 같이. 당신은 결국 당신이 JsonConvert.SerializeObject(model)와 JSON으로 모델을 직렬화하는 Json.Net를 사용할 수 있다고 생각

+1

당신이'model.ToString()'적절한 JSON을 생산하고 있는지처럼 약간 보일 것

? 그렇더라도 최소한 ToJsonString과 같은 별도의 메소드를 사용하는 것이 좋을 것입니다. 심지어 직렬화 코드를 그 클래스 안에 전혀 넣지 않는 것이 좋습니다. –

+1

[MCVE]가없는 경우에도 우리는별로 도움을 줄 수 없습니다. @EugenePodskal에 –

+0

지점이 있습니다. 'model.ToString()'은 내가하고 있다고 생각하는 것을하지 못했습니다. 'content : JsonConvert.SerializeObject (model)'로 변경됩니다. 그게 갈 길이야? –

답변

2

. 이것은 직렬화에 대해 작동합니다 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); 
} 
관련 문제