Отправить сообщение 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?
Ответы
Ответ 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.