Подтвердить что ты не робот

Отправить сообщение HTTP POST в ядре ASP.NET с использованием HttpClient PostAsJsonAsync

Я хочу отправить динамический объект, например

new { x = 1, y = 2 };

как тело сообщения HTTP POST. Поэтому я пытаюсь написать

var client = new HttpClient();

но я не могу найти метод

client.PostAsJsonAsync()

Итак, я попытался добавить пакет Microsoft.AspNetCore.Http.Extensions в project.json и добавить

using Microsoft.AspNetCore.Http.Extensions; 

to uses. Однако это мне не помогло.

Итак, какой самый простой способ отправить запрос POST с телом JSON в ядре ASP.NET?

4b9b3361

Ответ 1

Вы должны добавить ссылку на пакет "Microsoft.AspNet.WebApi.Client" (см. эту статью для примеров).

Без какого-либо дополнительного расширения вы можете использовать стандартный метод PostAsync:

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

где значение jsonInString вы можете получить, позвонив в JsonConvert.SerializeObject(<your object>);

Ответ 2

Я использую этот класс:

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

Пример использования:

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

Ответ 3

Я бы добавил к принятому ответу, что вы также захотите добавить заголовок Accept в httpClient:

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

Ответ 4

Вы можете использовать IEnterprise.Easy-HTTP, поскольку он имеет встроенный синтаксический анализ:

await new RequestBuilder<ExampleObject>()
.SetHost("https://httpbin.org")
.SetContentType(ContentType.Application_Json)
.SetType(RequestType.Post)
.SetModelToSerialize(dto)
.Build()
.Execute();

Ответ 5

Вы правы, что это давно реализовано в .NET Core.

На момент написания (сентябрь 2019 г.) файл project.json NuGet 3. x+ был заменен PackageReference (как описано в https://docs.microsoft.com/en-us/nuget/archive/project-json).

Чтобы получить доступ к методам *Async класса HttpClient, ваш файл .csproj должен быть правильно настроен.

Откройте файл .csproj в текстовом редакторе и убедитесь, что первая строка
<Project Sdk="Microsoft.NET.Sdk.Web">
(как указано в https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the-csproj-format).

Чтобы получить доступ к методам *Async класса HttpClient, вам также необходимо иметь правильную ссылку на пакет в вашем файле .csproj, например:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

(см. https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference. Также: мы рекомендуем приложения, ориентированные на ASP.NET Core 2.1 и более поздние версии, использовать метапакет Microsoft.AspNetCore.App, https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage)

Такие методы, как PostAsJsonAsync, ReadAsAsync, PutAsJsonAsync и DeleteAsync теперь должны работать из коробки. (Нет необходимости в использовании директивы.)

Обновление: Тег PackageReference больше не требуется в .NET Core 3.0.