2016-10-27 16 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 = 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" }

関連する問題