在上一篇文章中,我们已经学习了如何在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. SQL Server的嵌套存储过程中使用同名的临时表怪像浅析

      SQL Server的嵌套存储过程,外层存储过程和内层存储过程(被嵌套调用的存储过程)中可以存在相同名称的本地临时表吗?如果可以的话,那么有没有什么问题或限制呢? 在嵌套存储过程中,调用的是外层存 ...

  2. 说说Golang goroutine并发那些事儿

    摘要:今天我们一起盘点一下Golang并发那些事儿. Golang.Golang.Golang 真的够浪,今天我们一起盘点一下Golang并发那些事儿,准确来说是goroutine,关于多线程并发,咱 ...

  3. dp的小理解

    这段时间刷dp,总结出了一个不算套路的套路. 1.根据题意确定是否有重叠子问题,也就是前面的状态对后面的有影响,基本满足这个条件的就可以考虑用dp了. 2.确定是dp后,就是最难的部分--如何根据题意 ...

  4. sql-libs(2) 数字型

    经测试,发现是数字型的注入,直接 and 1=1 返回正常,and1=2返回错误,感觉比第一关更加简单一点啊,,透~ 经测试order by 为 3 . 1. union 注入 http://192. ...

  5. Front End Frameworks Trending 2021

    Front End Frameworks Trending 2021 Front End Frameworks https://2019.stateofjs.com/front-end-framewo ...

  6. auto open Chrome DevTools in the command line

    auto open Chrome DevTools in the command line --auto-open-devtools-for-tabs # macOS $ /Applications/ ...

  7. OpenCV & Web Assembly & Web Worker

    OpenCV & Web Assembly & Web Worker opencv-in-the-web https://aralroca.com/blog/opencv-in-the ...

  8. WebRTC 信令服务器

    WebRTC 信令服务器 node.js & V8 libuv socket.io https://socket.io/ node-static SSR https://github.com/ ...

  9. chrome device remote debug

    chrome device remote debug chrome://inspect/#devices chrome inspect devices Android chrome MIDI / MT ...

  10. input change only trigger once bug

    input change only trigger once bug clear first https://stackoverflow.com/a/11280934/5934465 upload E ...