Как передать объект 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);