Как передать объект HttpClient.PostAsync и сериализовать как тело JSON?
Я использую System.Net.Http
, Я нашел несколько примеров в интернете. Мне удалось создать этот код для make a POST
запрос:
public static string POST(string resource, string token)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", "")
});
var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
return resultContent;
}
}
все работает нормально. Но предположим, что я хочу передать третий парам POST
способ, параметров, называется data
. Параметр data-это такой объект:
object data = new
{
name = "Foo",
category = "article"
};
как я могу это сделать без создания KeyValuePair
? Мой php RestAPI
подождите ввода json, так что FormUrlEncodedContent
отправить raw
в JSON правильно. Но как я могу это сделать с Microsoft.Net.Http
? Спасибо.
3 ответов
прямой ответ на ваш вопрос: нет. Подпись для PostAsync
метод выглядит следующим образом:
public Task PostAsync (Uri requestUri, HttpContent content)
Итак, пока вы можете пройти object
to PostAsync
он должен быть типа HttpContent
и ваш анонимный тип не соответствует этим критериям.
тем не менее, есть способы выполнить то, что вы хотите выполнить. Во-первых, вам нужно будет сериализуйте свой анонимный тип в JSON, наиболее распространенным инструментом для этого являетсяJson.NET. И код для этого довольно тривиальный:
var myContent = JsonConvert.SerializeObject(data);
Далее вам нужно будет построить объект контента для отправки этих данных, я буду использовать ByteArrayContent
объект, но вы можете использовать или создать другой тип, если хотите.
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);
затем вы хотите установить тип контента, чтобы API знал, что это JSON.
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
тогда вы можете отправить свой запрос очень аналогично вашему предыдущему примеру с содержимым формы:
var result = client.PostAsync("", byteContent).Result
на боковой ноте, вызывая .Result
свойство, как вы делаете здесь, может иметь некоторые побочные эффекты например, мертвый замок, поэтому вы хотите быть осторожными с этим.
вам нужно передать свои данные в теле запроса в виде необработанной строки, а не FormUrlEncodedContent
. Один из способов сделать это-сериализовать его в строку JSON:
var json = JsonConvert.SerializeObject(data);
Теперь все, что вам нужно сделать, это передать строку в метод POST.
var stringContent = new StringContent(json, UnicodeEncoding.Utf8, "application/json");
var client = new HttpClient();
var response = await client.PostAsync(uri, stringContent);
простое решение-использовать Microsoft ASP.NET Web API 2.2 Client
С NuGet для.
затем вы можете просто сделать это, и он будет сериализовать объект в JSON и установить Content-Type
заголовок application/json; charset=utf-8
:
var data = new
{
name = "Foo",
category = "article"
};
var client = new HttpClient();
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var response = await client.PostAsJsonAsync("", data);