2016-10-27 4 views
2

쿼리 문자열 매개 변수와 JSON 본문 (POST의 경우)을 포함하도록 .NET HttpClient.SendAsync() 요청을 설정하는 방법은 무엇입니까?.NET HttpClient가 쿼리 문자열과 JSON 본문을 POST에 추가

// Query string parameters 
var queryString = new Dictionary<string, string>() 
{ 
    { "foo", "bar" } 
}; 

// Create json for body 
var content = new JObject(json); 

// Create HttpClient 
var client = new HttpClient(); 
client.BaseAddress = new Uri("https://api.baseaddress.com/"); 

var request = new HttpRequestMessage(HttpMethod.Post, "something"); 
// Setup header(s) 
request.Headers.Add("Accept", "application/json"); 
// Add body content 
request.Content = new StringContent(
    content.ToString(), 
    Encoding.UTF8, 
    "application/json" 
); 

// How do I add the queryString? 

// Send the request 
client.SendAsync(request); 

내가 본 모든 예는

request.Content = new FormUrlEncodedContent(queryString) 

을 설정하지만 그때 나는 내가 필요로 무엇 이었습니까 Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString()을 찾는까지 끝난 request.Content

+0

['HttpRequestMessage'이있는'RequestUri처럼 'property] (https://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage.requesturi (v = vs.118) .aspx); 그것을 사용하여 쿼리 문자열을 추가하십시오 (새로운'Uri' 객체를 생성하고'RequestUri'를 설정해야 할 것 같습니다). –

+0

@MikeMcCaughan 나는 이것을 조사해 내 endpoint + queryString 정보로'RequestUri' 속성을 다시 설정하면'HttpClient' 객체에서 전역 적으로 설정 한'HttpClient.BaseAddress'를 덮어 쓰는 것을 발견했습니다. 하지만이 방법은 내가 찾고있는 해결책으로 나를 이끌었다. –

답변

2

내 JSON 본체 초기화를 잃는 것을 말한다. 이것은 수동으로 문자열을 만들 필요없이 쿼리 문자열 매개 변수를 추가 할 수있게 해주었습니다 (이스케이프 문자 등의 걱정).

참고 : 나는 ASP.NET 코어를 사용하고 있지만, 같은 방법도 Microsoft.Owin.Infrastructure.WebUtilities.AddQueryString()

새로운 코드를 통해 볼 수 있습니다 : 당신이 목적을 위해 RestSharp를 사용하는 것이

// Query string parameters 
var queryString = new Dictionary<string, string>() 
{ 
    { "foo", "bar" } 
}; 

// Create json for body 
var content = new JObject(json); 

// Create HttpClient 
var client = new HttpClient(); 
client.BaseAddress = new Uri("https://api.baseaddress.com/"); 

// This is the missing piece 
var requestUri = QueryHelpers.AddQueryString("something", queryString); 

var request = new HttpRequestMessage(HttpMethod.Post, requestUri); 
// Setup header(s) 
request.Headers.Add("Accept", "application/json"); 
// Add body content 
request.Content = new StringContent(
    content.ToString(), 
    Encoding.UTF8, 
    "application/json" 
); 

// Send the request 
client.SendAsync(request); 
0

내가 제안 할 수 있습니다. 기본적으로 HttpClient의 래퍼입니다. url 및 body 매개 변수를 쉽게 구성하고 결과를 역 직렬화 할 수 있습니다. 사이트에서

예 :

var client = new RestClient("http://example.com"); 

var request = new RestRequest("resource/{id}", Method.POST); 
request.AddParameter("name", "value"); // adds to POST or URL querystring based on Method 
request.AddUrlSegment("id", "123"); // replaces matching token in request.Resource 

// easily add HTTP Headers 
request.AddHeader("header", "value"); 

// add files to upload (works with compatible verbs) 
request.AddFile(path); 

// execute the request 
IRestResponse response = client.Execute(request); 
1

이 간단하고 나를 위해 작동 : 요청의

responseMsg = await httpClient.PostAsJsonAsync(locationSearchUri, new { NameLike = "Johnson" }); 

몸은 { NameLike:"Johnson" }