web-dev-qa-db-ja.com

.NET HttpClientは、クエリ文字列とJSON本文をPOST

.NET HttpClient.SendAsync()リクエストを設定して、クエリ文字列パラメーターと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)

しかし、その後、request.Content

8
Kevin R

結局、Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString()を見つけることになりました。これにより、文字列を手動で作成せずにクエリ文字列パラメーターを追加できました(および文字のエスケープなどを心配します)。

注:ASP.NET Coreを使用していますが、Microsoft.Owin.Infrastructure.WebUtilities.AddQueryString()でも同じ方法を使用できます

新しいコード:

// 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);
12
Kevin R

この目的で RestSharp を使用することをお勧めします。これは基本的にHttpWebRequestのラッパーであり、必要な処理を正確に実行します。つまり、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