我想发送像
这样的动态对象new { x = 1, y = 2 };
作为HTTP POST消息的主体。所以我试着写
var client = new HttpClient();
但我无法找到方法
client.PostAsJsonAsync()
所以我尝试将Microsoft.AspNetCore.Http.Extensions包添加到project.json并添加
using Microsoft.AspNetCore.Http.Extensions;
使用子句。但是它没有帮助我。
那么在ASP.NET Core中使用JSON主体发送POST请求的最简单方法是什么?
答案 0 :(得分:139)
您应该添加对" Microsoft.AspNet.WebApi.Client"的引用。包(读取this article样本)。
如果没有任何其他扩展名,您可以使用标准PostAsync
方法:
client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));
您可以通过调用jsonInString
JsonConvert.SerializeObject(<your object>);
值
答案 1 :(得分:64)
我使用这个类:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a onclick="scrollToAnchor('1')">nav 1</a>
<a onclick="scrollToAnchor('2')">nav 2</a>
<a onclick="scrollToAnchor('3')">nav 3</a>
<div class="content" id="1">1</div>
<div class="content" id="2">2</div>
<div class="content" id="3">3</div>
使用样本:
public class JsonContent : StringContent
{
public JsonContent(object obj) :
base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
{ }
}
答案 2 :(得分:9)
我会在接受的答案中添加您希望将Accept
标题添加到httpClient
:
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
答案 3 :(得分:3)
Microsoft现在建议使用具有以下优点的IHttpClientFactory
:
HttpClient
个实例。例如,名为github的客户端可能是
注册并配置为访问GitHub。默认客户端可以是
已注册以供一般访问。HttpClient
中。提供基于Polly的中间件扩展
在HttpClient
中委派处理程序的好处。HttpClientMessageHandler
个实例。自动管理避免
手动时常见的DNS(域名系统)问题
管理HttpClient
的生存期。ILogger
)
通过工厂创建的客户发送。设置:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient();
// Remaining code deleted for brevity.
POST示例:
public class BasicUsageModel : PageModel
{
private readonly IHttpClientFactory _clientFactory;
public BasicUsageModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task CreateItemAsync(TodoItem todoItem)
{
var todoItemJson = new StringContent(
JsonSerializer.Serialize(todoItem, _jsonSerializerOptions),
Encoding.UTF8,
"application/json");
var httpClient = _clientFactory.CreateClient();
using var httpResponse =
await httpClient.PostAsync("/api/TodoItems", todoItemJson);
httpResponse.EnsureSuccessStatusCode();
}
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1
答案 4 :(得分:1)
您可以使用IEnterprise.Easy-HTTP,因为它内置了类解析:
await new RequestBuilder<ExampleObject>()
.SetHost("https://httpbin.org")
.SetContentType(ContentType.Application_Json)
.SetType(RequestType.Post)
.SetModelToSerialize(dto)
.Build()
.Execute();
答案 5 :(得分:1)
您是对的,因为它早已在.NET Core中实现。
在撰写本文时(2019年9月),NuGet 3.x +的project.json
文件已由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
文件中具有正确的 package引用,如下所示:
<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
之类的方法现在应该可以立即使用。 (无需使用指令。)
更新 :. NET Core 3.0中不再需要PackageReference标记。