在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求

在上一篇文章中,我们已经学习了如何在ASP.NET Core中使用HttpClient从Web API获取数据。此外,我们还学习了如何使用GetAsync方法和HttpRequestMessage类发送GET请求。在本文中,我们将学习如何在ASP.NET Core中使用HttpClient发送POST、PUT和DELETE请求,并使用PostAsync、PutAsync、DeleteAsync和HttpRequestMessage类创建请求。

在ASP.NET Core中使用HttpClient发送POST请求

如果读过上一篇文章,就知道在CompanyEmployees.Client中有一个HttpClientCrudService 类。这个类已经包含了两个方法,我们将在本文中对它进行扩展。

既然配置已经准备好了,我们可以添加一个新方法来发送POST请求到Web API:

private async Task CreateCompany()
{
 var companyForCreation = new CompanyForCreationDto
 {
  Name = "Eagle IT Ltd.",
  Country = "USA",
  Address = "Eagle IT Street 289"
 };

 var company = JsonSerializer.Serialize(companyForCreation);

 var requestContent = new StringContent(company, Encoding.UTF8, "application/json");

 var response = await _httpClient.PostAsync("companies", requestContent);
 response.EnsureSuccessStatusCode();

 var content = await response.Content.ReadAsStringAsync();
 var createdCompany = JsonSerializer.Deserialize<CompanyDto>(content, _options);
}

我们首先准备一个想要创建的company对象,并使用serialize方法对其进行序列化。然后,创建一个新的StringContent对象,提供序列化所需的数据及参数。之后,我们使用PostAsync方法将POST请求发送到API。在收到响应之后,我们检查它是否成功。然后,通过使用ReadAsStringAsync方法读取内容并使用JsonSerializerOptions参数对内容进行反序列化(来自上一篇文章)。请记住我们在上一篇文章中创建的_options参数。

此时,我们必须确保客户端应用程序调用这个方法。然后修改Execute方法:

public async Task Execute()
{
 //await GetCompanies();
 //await GetCompaniesWithXMLHeader();
 await CreateCompany();
}

现在,如果我们在CreateCompany方法中放置一个断点,并启动两个应用程序:

我们可以看到结果。如果你愿意,还也可以查一下数据库。

使用HttpRequestMessage发送POST请求

PostAsync方法是一个快捷方法,因为它封装了HttpRequestMessage类。正如我们所见,它非常好用。但是,如果我们想对请求有更大的控制,并显式地设置不同的请求选项,如header,我们必须使用HttpRequestMessage类。那么,让我们看看如何做到这一点:​​​​​​​

private async Task CreateCompanyWithHttpRequestMessage()
{
 var companyForCreation = new CompanyForCreationDto
 {
  Name = "Hawk IT Ltd.",
  Country = "USA",
  Address = "Hawk IT Street 365"
 };

 var company = JsonSerializer.Serialize(companyForCreation);

 var request = new HttpRequestMessage(HttpMethod.Post, "companies");
 request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 request.Content = new StringContent(company, Encoding.UTF8);
 request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

 var response = await _httpClient.SendAsync(request);
 response.EnsureSuccessStatusCode();

 var content = await response.Content.ReadAsStringAsync();
 var createdCompany = JsonSerializer.Deserialize<CompanyDto>(content, _options);
}

同样,我们从创建companyForCreation对象及其序列化开始。然后,我们在创建一个HttpRequestMessage对象,并提供请求类型和地址。在此之后,我们添加一个accept头,以确定我们支持哪种格式作为响应。紧接着,我们使用StringContent类并提供序列化数据对象和编码类型来填充请求。同样,我们用ContentType属性指定请求的媒体类型。

我们也可以在StringContent类的构造函数中配置ContentType,但是有了这个实现,就更容易理解过程。

为了发送请求,我们使用SendAsync方法。在确定返回成功的状态码之后,我们读取内容并反序列化它。

现在,我们可以修改Execute方法:​​​​​​​

public async Task Execute()
{
 //await GetCompanies();
 //await GetCompaniesWithXMLHeader();
 //await CreateCompany();
 await CreateCompanyWithHttpRequestMessage();
}

在我们的新方法中放置一个断点,然后启动我们的客户端应用:

可以看到,数据成功创建了。同样,如果检查响应,我们会发现201:

在ASP.NET Core中使用HttpClient发送一个PUT请求

就像处理POST请求一样,我们将首先使用快捷方法,然后展示如何使用HttpRequestMessage类做同样的事情。

在修改客户端项目之前,我们只想提一下,Web API的UpdateCompany操作返回了一个NoContent响应。因此,在客户端上不需要反序列化任何内容,只有一个204状态码。

也就是说,我们已经准备好在HttpClientCrudService 类中添加一个新方法:​​​​​​​

private async Task UpdateCompany()
{
 var updatedCompany = new CompanyForUpdateDto
 {
  Name = "Eagle IT Ltd.",
  Country = "USA",
  Address = "Eagle IT Street 289 Updated"
 };

 var company = JsonSerializer.Serialize(updatedCompany);

 var requestContent = new StringContent(company, Encoding.UTF8, "application/json");

 var uri = Path.Combine("companies", "fc12c11e-33a3-45e2-f11e-08d8bdb38ded");
 var response = await _httpClient.PutAsync(uri, requestContent);
 response.EnsureSuccessStatusCode();
}

在这个方法中,我们创建一个新的updatedCompany对象,该对象具有修改后的Address属性。然后,就像我们在CreateCompany方法中所做的那样,序列化对象并创建一个新的StringContent。在此之后,我们在控制器创建更新数据的action。一旦这样做了,我们将使用PutAsync快捷方法发送PUT请求,并确保接收到一个成功的状态码。在本例中是204 - NoContent状态码。

有了这些,我们可以修改Execute方法:​​​​​​​

public async Task Execute()
{
 ...
 await UpdateCompany();
}

现在,让我们在UpdateCompany方法中放置一个断点,并启动应用程序:

同样,如果我们检查我们的数据库:

现在可以确认我们数据更新成功了。

使用HttpRequestMessage类发送PUT请求

正如我们已经说过的,使用HttpRequestMessage类可以让我们更好地控制请求。所以,让我们看看如何利用它来发送PUT请求:​​​​​​​

private async Task UpdateCompanyWithHttpRequestMessage()
{
 var updatedCompany = new CompanyForCreationDto
 {
  Name = "Hawk IT Ltd.",
  Country = "USA",
  Address = "Hawk IT Street 365 Updated"
 };

 var company = JsonSerializer.Serialize(updatedCompany);

 var uri = Path.Combine("companies", "29bc0429-eb4d-4eeb-f11d-08d8bdb38ded");
 var request = new HttpRequestMessage(HttpMethod.Put, uri);
 request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 request.Content = new StringContent(company, Encoding.UTF8);
 request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

 var response = await _httpClient.SendAsync(request);
 response.EnsureSuccessStatusCode();
}

当我们查看这个方法时,可以看到它的实现与CreateCompanyWithHttpRequestMessage方法几乎相同。当然,这里我们创建了一个额外的uri参数,并且我们没有反序列化响应正文内容,因为它是空的。

在方法实现之后,让我们从Execute方法中调用它:​​​​​​​

public async Task Execute()
{
 ...
 await UpdateCompanyWithHttpRequestMessage();
}

让我们启动应用程序:

成功了。如果不放心也可以检查一下数据库。

使用HttpClient发送DELETE请求

由于DELETE请求是前面所有请求中最简单的,所以我们只展示代码。所以,让我们首先看看如何发送一个带有快捷方式DeleteAsync方法的DELETE请求:​​​​​​​

private async Task DeleteCompany()
{
 var uri = Path.Combine("companies", "fc12c11e-33a3-45e2-f11e-08d8bdb38ded");

 var response = await _httpClient.DeleteAsync(uri);
 response.EnsureSuccessStatusCode();
}

同样,让我们从Execute方法中调用这个方法:​​​​​​​

public async Task Execute()
{
 ...
 await DeleteCompany();
}

一旦我们运行客户端应用程序,我们就会得到204响应。这是Web API中DELETE操作的有效响应。

现在,让我们看看如何使用HttpRequestMessage类来做同样的事情:​​​​​​​

private async Task DeleteCompanyWithHttpResponseMessage()
{
 var uri = Path.Combine("companies", "29bc0429-eb4d-4eeb-f11d-08d8bdb38ded");
 var request = new HttpRequestMessage(HttpMethod.Delete, uri);
 request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

 var response = await _httpClient.SendAsync(request);
 response.EnsureSuccessStatusCode();
}

也没什么新鲜的。我们仍然在请求中添加accept头。然后,我们必须在客户端反序列化这些内容。我们可以从Execute方法中调用这个方法并运行应用程序,应该会收到204状态码。

结论

因此,在本文中,我们学习了如何使用快捷方法和HttpRequestMessage类从客户端应用程序发送POST、PUT和DELETE请求。结合我们从上一篇文章中获得的知识,我们已经使用HttpClient类覆盖了所有的CRUD方法。

在下一篇文章中,我们将更多地了解PATCH请求以及如何使用HttpClient发送它。

原文链接:https://code-maze.com/httpclient-example-aspnet-core-post-put-delete/

以上就是在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求的详细内容,更多关于ASP.NET Core中应用HttpClient的资料请关注我们其它相关文章!

(0)

相关推荐

  • 在ASP.NET Core中应用HttpClient获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用HttpRequestMessage类来实现这些功能.在以后的文章中,我们将学习如何发送POST.PUT和DELETE请求,以及如何使用HttpClient发送PATCH请求. 要下载源代码,可以访问https://github.com/CodeMazeBlog/httpclient-aspnetcor

  • 如何在Asp.Net Core中集成Refit

    在很多时候我们在不同的服务之间需要通过HttpClient进行及时通讯,在我们的代码中我们会创建自己的HttpClient对象然后去跨领域额进行数据的交互,但是往往由于一个项目有多个人开发所以在开发中没有人经常会因为不同的业务请求去写不同的代码,然后就会造成各种风格的HttpClient的跨域请求,最重要的是由于每个人对HttpClient的理解程度不同所以写出来的代码可能质量上会有参差不齐,即使代码能够达到要求往往也显得非常臃肿,重复高我们在正式介绍Refit这个项目之前,我们来看看我们在项目

  • ASP.NET Core MVC解决控制器同名Action请求不明确的问题

    在Asp.Net Core MVC Web应用程序的开发过程当中,如果需要在控制器内使用同名的Action,则会出现如下图所示的问题: https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/routing?view=aspnetcore-5.0 代码片段如下: ` //GET: /HelloWorld/Welcome public string Welcome() { return "这是HelloWorld控制器下的Welco

  • ASP.NET Core WebApi版本控制的实现

    前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi版本控制,那么版本控制有什么好处呢? WebApi版本控制的好处 有助于及时推出功能, 而不会破坏现有系统,兼容性处理更友好. 它还可以帮助为选定的客户提供额外的功能. 接下来就来实现版本控制以及在Swagger UI中接入WebApi版本 一.WebApi版本控制实现 通过Microsoft.As

  • 在 ASP.Net Core 中使用 MiniProfiler的方法

    web应用程序的性能相信是大家普遍关心的一个问题,也相信大家有很多工具可用来分析应用程序的性能并能够找到其中的瓶颈,MiniProfiler 就是这个领域中的一款产品,它是一款简单的,功能强大的web应用分析工具,MiniProfiler 可用来帮助我们找到 慢查询, 慢响应 等问题. MiniProfiler 可用在 Asp.Net 和 ASP.Net Core 中,这篇文章将会讨论如何使用 MiniProfiler,并通过它找到应用程序的性能问题. 安装 MiniProfiler 要想使用

  • 如何在Asp.Net Core中集成ABP Dapper

    在实际的项目中,除了集成ABP框架的EntityFrameworkCore以外,在有些特定的场景下不可避免地会使用一些SQL查询语句,一方面是由于现在的EntityFrameworkCore2.X有些问题没有解决,另外一方面是基于性能方面的考虑,在了解本篇内容之前,首先还是来看看官方文档来给出的说明. 按照官方的介绍整体可以分为下面的步骤:1 安装依赖包.2 添加DependsOn属性标签.3 Entity to Table Mapping. 4 Usage 通过上面的4个步骤我们就能够正常在A

  • Asp.Net Core 调用第三方Open API查询物流数据的示例

    在我们的业务中不可避免要与第三方的系统进行交互,调用他们提供的API来获取相应的数据,那么对于这样的情况该怎样进行处理呢?下面就结合自己对接跨越速运接口来获取一个发运单完整的物流信息为例来说明如何在Asp.Net Core中通过代码实现.当然在他们的官方网站上面会给出具体的API调用方式以及参数格式,作为调用方只需要根据相应规则来进行编码即可,下面以我们查询某一个具体的发运单的物流信息为例来进行说明. 下面以一个查询路由详细信息为例来进行说明.当前接口主要包括:1 概述. 2 系统参数. 3 

  • ASP.NET Core对不同类型的用户进行区别限流详解

    前言 老板提出了一个新需求,从某某天起,免费用户每天只能查询100次,收费用户100W次. 这是一个限流问题,聪明的你也一定想到了如何去做:记录用户每一天的查询次数,然后根据当前用户的类型使用不同的数字做比较,超过指定的数字就返回错误. 嗯,原理就是这么简单.不过真正写起来还要考虑更多问题: 统计数据的数据结构是什么样的?字典 or 行记录? 统计数据记录到哪里?内存 or MySQL or Redis? 分布式应用怎么精确计数?分布式锁 or 队列 or 事务? 吞吐量比较大时如何扛得住?内存

  • 在ASP.NET Core中用HttpClient发送POST, PUT和DELETE请求

    在上一篇文章中,我们已经学习了如何在ASP.NET Core中使用HttpClient从Web API获取数据.此外,我们还学习了如何使用GetAsync方法和HttpRequestMessage类发送GET请求.在本文中,我们将学习如何在ASP.NET Core中使用HttpClient发送POST.PUT和DELETE请求,并使用PostAsync.PutAsync.DeleteAsync和HttpRequestMessage类创建请求. 在ASP.NET Core中使用HttpClient

  • ASP.NET Core使用HttpClient调用WebService

    一.创建WebService 我们使用VS创建一个WebService,增加一个PostTest方法,方法代码如下 using System.Web.Services; namespace WebServiceDemo { /// <summary> /// WebTest 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(Conform

  • Java 使用 HttpClient 发送 GET请求和 POST请求

    目录 概述 认证方式 基础认证Auth 用户名密码认证 Bearer Token 认证 配置超时 生成 RequestConfig 设置超时时间 概述 日常工作中,我们经常会有发送 HTTP 网络请求的需求,概括下我们常见的发送 HTTP 请求的需求内容: 可以发送基本的 GET/POST/PUT/DELETE 等请求: HTTP请求,可以附带认证,包括基本的 用户名/密码 认证,以及 Bearer Token 认证: 请求可以自定义 超时时间: HTTP请求可以带参数,也可以不带参数: HTT

  • 关于dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库的问题

    目录 背景 使用方法 服务端 客户端 这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源项目提供的基于 NamedPipeStream 命名管道的方式进行通讯.相当于替换掉 ASP.NET Core 的底层通讯方式,从走网络换成命名管道的方式.本库的优势是可以使用设计非常好的 ASP.NET Core 的 MVC 框架作为顶层调用 API 层,底层

  • ASP.NET Core应用错误处理之三种呈现错误页面的方式

    前言 由于ASP.NET Core应用是一个同时处理多个请求的服务器应用,所以在处理某个请求过程中抛出的异常并不会导致整个应用的终止.出于安全方面的考量,为了避免敏感信息的外泄,客户端在默认的情况下并不会得到详细的出错信息,这无疑会在开发环境下增加查错纠错的难度.对于生产环境来说,我们也希望最终用户能够根据具体的错误类型得到具有针对性并且友好的错误消息.ASP.NET Core提供了相应的中间件帮助我们将定制化的错误信息呈现出来,这些中间件都定义在"Microsoft.AspNetCore.Di

  • ASP.NET Core MVC学习教程之路由(Routing)

    前言 ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它在搜索引擎优化(SEO)和链接生成中运行良好,而不用关心Web服务器上的文件是怎么组织的.我们可以方便的使用路由模板语法定义路由,路由模板语法支持路由值约束,默认值和可选值. 基于约束的路由允许全局定义应用支持的URL格式,以及这些格式是怎样各自在给定的控制器中映射到指定的操作方法(Action

  • ASP.NET Core基础之中间件

    什么是ASP.NET Core Middleware? ASP.NET Core中间件组件是被组装到应用程序管道中以处理HTTP请求和响应的软件组件(从技术上来说,组件只是C#类). ASP.NET Core应用程序中的每个中间件组件都执行以下任务. 选择是否将 HTTP 请求传递给管道中的下一个组件.这可以通过在中间件中调用下一个 next() 方法实现. 可以在管道中的下一个组件之前和之后执行工作. 在ASP.NET Core中,已经有很多内置的中间件组件可供使用,您可以直接使用它们. 如果

  • ASP.NET Core MVC路由(Routing)的用法

    目录 1.设置路由中间件 2.常规路由 3.多路由 1.回退 2.行动歧义 3.路由名称 4.路由特性 5.组合路由 6.特性路由的顺序 7.路由模板中的标记替换( [controller] , [action] , [area]) 8.使用IRouteTemplateProvider自定义路由特性 9.使用应用程序模型来自定义特性路由 10.URL生成 11.通过操作名生成URL 12.通过路由名生成URL 13.在操作结果中生成URL 14.专用常规路由的特殊情况 15.区域 16.IAct

  • [译]ASP.NET Core 2.0 路由引擎详解

    本文介绍了ASP.NET Core 2.0 路由引擎详解,分享给大家,具体如下: 问题 ASP.NET Core 2.0的路由引擎是如何工作的? 答案 创建一个空项目,为Startup类添加MVC服务和请求中间件: public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app, IHostingEnvir

  • ASP.NET Core跨站登录重定向的实现新姿势

    前言 作为 .NET 程序员,痛苦之一是自从 ASP.NET 诞生之日起直到最新的 ASP.NET Core 都无法直接实现跨站登录重定向(比如访问 https://q.cnblogs.com ,跳转到 https://passport.cnblogs.com 进行登录),只能跳转到当前站点. 具体拿 ASP.NET Core 来说就是 CookieAuthenticationOptions.LoginPath 只能指定路径,不能指定包含主机名的完整 url ,ASP.NET Core 会在重定

随机推荐