私は、この仕事をすべての人と私自身へのメモとして行うときに、すべてを1つの応答で答えたいと思います。
Serezの回答によると、HttpContent派生クラスのリストは以下のとおりです
https://stackoverflow.com/a/42380027/914284
HttpClient PostAsyncには、作業しているコンテキストに応じていくつかの背景があります。
- サーバーコンテキストが次のように待機する場合に備えて、サーバーに送信するタイプごとにデータを投稿できます。
[HttpPost]
public async Task<IActionResult> Submit(MyModel model)
[HttpPost]
public async Task<IActionResult> Submit([FromForm] MyModel model)
[HttpPost]
public async Task<IActionResult> Submit([FromBody] MyModel model)
FromFormまたはBodyを作成する場合、FromFormとして機能します。FromBodyにはjsonコンテンツが必要です。それ以外の場合は、行としてKeyValuePairsが必要です。以下のように、両方の実装がいくつかあります。
FromFormの場合:拡張機能を使用しました
public static class HelperExtensions
{
public static FormUrlEncodedContent ToFormData(this object obj)
{
var formData = obj.ToKeyValue();
return new FormUrlEncodedContent(formData);
}
public static IDictionary<string, string> ToKeyValue(this object metaToken)
{
if (metaToken == null)
{
return null;
}
// Added by me: avoid cyclic references
var serializer = new JsonSerializer { ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
if (metaToken is not JToken token)
{
// Modified by me: use serializer defined above
return ToKeyValue(JObject.FromObject(metaToken, serializer));
}
if (token.HasValues)
{
var contentData = new Dictionary<string, string>();
foreach (var child in token.Children().ToList())
{
var childContent = child.ToKeyValue();
if (childContent != null)
{
contentData = contentData.Concat(childContent)
.ToDictionary(k => k.Key, v => v.Value);
}
}
return contentData;
}
var jValue = token as JValue;
if (jValue?.Value == null)
{
return null;
}
var value = jValue?.Type == JTokenType.Date ?
jValue?.ToString("o", CultureInfo.InvariantCulture) :
jValue?.ToString(CultureInfo.InvariantCulture);
return new Dictionary<string, string> { { token.Path, value } };
}
}
FromBodyの場合:任意のjsonコンバータライブラリNewtonsoftまたはmicrosoftを使用します
using Newtonsoft.Json;
var jsonString = JsonConvert.SerializeObject(obj);
どちらの場合も、コンテンツタイプは要件に従って定義する必要があります。たとえば、json(ヘッダーへの書き込み)の場合です。
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
または別の使用法
using (var content = new StringContent(JsonConvert.SerializeObject(answer), System.Text.Encoding.UTF8, "application/json"))
{
var answerResponse = await client.PostAsync(url, content);
//use await it has moved in some context on .core 6.0
}
コンテキストで承認を使用する必要がある場合は、以下のように承認を提供することもできます。
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");