在上一篇文章中,我们已经学习了如何在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请求的更多相关文章

  1. 在ASP.NET Core中用HttpClient(三)——发送HTTP PATCH请求

    在前面的两篇文章中,我们讨论了很多关于使用HttpClient进行CRUD操作的基础知识.如果你已经读过它们,你就知道如何使用HttpClient从API中获取数据,并使用HttpClient发送PO ...

  2. 在ASP.NET Core中用HttpClient(一)——获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...

  3. 在ASP.NET Core中用HttpClient(四)——提高性能和优化内存

    到目前为止,我们一直在使用字符串创建请求体,并读取响应的内容.但是我们可以通过使用流提高性能和优化内存.因此,在本文中,我们将学习如何在请求和响应中使用HttpClient流. 什么是流 流是以文件. ...

  4. 在ASP.NET Core中用HttpClient(五)——通过CancellationToken取消HTTP请求

    ​用户向服务器发送HTTP请求应用程序页面是一种非常可能的情况.当我们的应用程序处理请求时,用户可以从该页面离开.在这种情况下,我们希望取消HTTP请求,因为响应对该用户不再重要.当然,这只是实际应用 ...

  5. 在ASP.NET Core中用HttpClient(六)——ASP.NET Core中使用HttpClientFactory

    ​到目前为止,我们一直直接使用HttpClient.在每个服务中,我们都创建了一个HttpClient实例和所有必需的配置.这会导致了重复代码.在这篇文章中,我们将学习如何通过使用HttpClient ...

  6. C# ASP.NET Core使用HttpClient的同步和异步请求

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  7. php发送http put/patch/delete请求

    今天学RESTful API的编写,发现不知道怎么发送HTTP PUT/PATCH/DELETE请求,还是要学习一个. 使用curl_opt函数来发送各式各样的http请求动作,不仅限于get和pos ...

  8. php发送http put/patch/delete请求Demo

    CURL请求对于PHPer是必备技能,使用curl_opt函数来发送各式各样的http请求动作,不仅限于get和post.在测试自己的restful api的时候,通过访问这个代理发送http put ...

  9. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

随机推荐

  1. Rsyncd 同步服务

    目录 数据备份的策略 三种数据备份 三种数据备份的比较(转载) 不同数据备份类型组合说明(转载) Rsyncd 服务传输模式(remote synchronizetion deamon) 本地传输模式 ...

  2. codeforces 911D

    D. Inversion Counting time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  3. C++中函数的形式参数引用

    形式参数的传递方式 值传递 值传递是将数值传递到程序中,这种方式传递是单向传递 但是如果想要双向传递,这种视频无法满足: 引用传递 引用传递可以实现双向的传递 为了对比处两个之间的差异,这里举出两个例 ...

  4. npm publish bug & solution

    npm publish bug & solution npm ERR! Unexpected token < in JSON at position 0 while parsing ne ...

  5. Get your site working on Google Search Console , 在 Google Search Console中运行您的网站, Google Search Console

    1 1 https://support.google.com/webmasters/topic/4564315? Search Console Help SEARCH CONSOLEHELP FORU ...

  6. 「NGK每日快讯」2021.2.3日NGK公链第92期官方快讯!

  7. NGK生态商城即将上线官网,推动生态落地应用

    NGK生态商城即将上线官网,以推动生态落地应用.此举意味着NGK生态将跻身区块链顶尖之列,同时,NGK代币.NGK Dapp游戏 "呼叫河马" 以及NGK DeFi项目Baccar ...

  8. 【.NET 与树莓派】控制舵机

    不管是小马达,还是大马达,嗯,也就是电机,相信大伙伴们也不会陌生.四驱车是一种很优秀的玩具,从老周小时候就开始流行(动画片<四驱兄弟>估计很多大朋友都看过),直到现在还能看到很多卖四驱车的 ...

  9. flatbuffer与protobuf对比

    在内存空间占用这个指标上,FlatBuffers占用的内存空间比protobuf多了两倍.序列化时二者的cpu计算时间FB比PB快了3000ms左右,反序列化时二者的cpu计算时间FB比PB快了900 ...

  10. ConcurrentHashMap允许一边遍历一边更新,而用HashMap则会报线程安全问题

    ConcurrentHashMap线程安全的,允许一边更新.一边遍历,也就是说在对象遍历的时候,也可以进行remove,put操作,且遍历的数据会随着remove,put操作产出变化,而如果用Hash ...