在ASP.NET Core中用HttpClient發(fā)送POST, PUT和DELETE請求
在上一篇文章中,我們已經(jīng)學(xué)習(xí)了如何在ASP.NET Core中使用HttpClient從Web API獲取數(shù)據(jù)。此外,我們還學(xué)習(xí)了如何使用GetAsync方法和HttpRequestMessage類發(fā)送GET請求。在本文中,我們將學(xué)習(xí)如何在ASP.NET Core中使用HttpClient發(fā)送POST、PUT和DELETE請求,并使用PostAsync、PutAsync、DeleteAsync和HttpRequestMessage類創(chuàng)建請求。
在ASP.NET Core中使用HttpClient發(fā)送POST請求
如果讀過上一篇文章,就知道在CompanyEmployees.Client中有一個HttpClientCrudService 類。這個類已經(jīng)包含了兩個方法,我們將在本文中對它進行擴展。
既然配置已經(jīng)準備好了,我們可以添加一個新方法來發(fā)送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); }
我們首先準備一個想要創(chuàng)建的company對象,并使用serialize方法對其進行序列化。然后,創(chuàng)建一個新的StringContent對象,提供序列化所需的數(shù)據(jù)及參數(shù)。之后,我們使用PostAsync方法將POST請求發(fā)送到API。在收到響應(yīng)之后,我們檢查它是否成功。然后,通過使用ReadAsStringAsync方法讀取內(nèi)容并使用JsonSerializerOptions參數(shù)對內(nèi)容進行反序列化(來自上一篇文章)。請記住我們在上一篇文章中創(chuàng)建的_options參數(shù)。
此時,我們必須確??蛻舳藨?yīng)用程序調(diào)用這個方法。然后修改Execute方法:
public async Task Execute() { //await GetCompanies(); //await GetCompaniesWithXMLHeader(); await CreateCompany(); }
現(xiàn)在,如果我們在CreateCompany方法中放置一個斷點,并啟動兩個應(yīng)用程序:
我們可以看到結(jié)果。如果你愿意,還也可以查一下數(shù)據(jù)庫。
使用HttpRequestMessage發(fā)送POST請求
PostAsync方法是一個快捷方法,因為它封裝了HttpRequestMessage類。正如我們所見,它非常好用。但是,如果我們想對請求有更大的控制,并顯式地設(shè)置不同的請求選項,如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); }
同樣,我們從創(chuàng)建companyForCreation對象及其序列化開始。然后,我們在創(chuàng)建一個HttpRequestMessage對象,并提供請求類型和地址。在此之后,我們添加一個accept頭,以確定我們支持哪種格式作為響應(yīng)。緊接著,我們使用StringContent類并提供序列化數(shù)據(jù)對象和編碼類型來填充請求。同樣,我們用ContentType屬性指定請求的媒體類型。
我們也可以在StringContent類的構(gòu)造函數(shù)中配置ContentType,但是有了這個實現(xiàn),就更容易理解過程。
為了發(fā)送請求,我們使用SendAsync方法。在確定返回成功的狀態(tài)碼之后,我們讀取內(nèi)容并反序列化它。
現(xiàn)在,我們可以修改Execute方法:
public async Task Execute() { //await GetCompanies(); //await GetCompaniesWithXMLHeader(); //await CreateCompany(); await CreateCompanyWithHttpRequestMessage(); }
在我們的新方法中放置一個斷點,然后啟動我們的客戶端應(yīng)用:
可以看到,數(shù)據(jù)成功創(chuàng)建了。同樣,如果檢查響應(yīng),我們會發(fā)現(xiàn)201:
在ASP.NET Core中使用HttpClient發(fā)送一個PUT請求
就像處理POST請求一樣,我們將首先使用快捷方法,然后展示如何使用HttpRequestMessage類做同樣的事情。
在修改客戶端項目之前,我們只想提一下,Web API的UpdateCompany操作返回了一個NoContent響應(yīng)。因此,在客戶端上不需要反序列化任何內(nèi)容,只有一個204狀態(tài)碼。
也就是說,我們已經(jīng)準備好在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(); }
在這個方法中,我們創(chuàng)建一個新的updatedCompany對象,該對象具有修改后的Address屬性。然后,就像我們在CreateCompany方法中所做的那樣,序列化對象并創(chuàng)建一個新的StringContent。在此之后,我們在控制器創(chuàng)建更新數(shù)據(jù)的action。一旦這樣做了,我們將使用PutAsync快捷方法發(fā)送PUT請求,并確保接收到一個成功的狀態(tài)碼。在本例中是204 - NoContent狀態(tài)碼。
有了這些,我們可以修改Execute方法:
public async Task Execute() { ... await UpdateCompany(); }
現(xiàn)在,讓我們在UpdateCompany方法中放置一個斷點,并啟動應(yīng)用程序:
同樣,如果我們檢查我們的數(shù)據(jù)庫:
現(xiàn)在可以確認我們數(shù)據(jù)更新成功了。
使用HttpRequestMessage類發(fā)送PUT請求
正如我們已經(jīng)說過的,使用HttpRequestMessage類可以讓我們更好地控制請求。所以,讓我們看看如何利用它來發(fā)送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(); }
當我們查看這個方法時,可以看到它的實現(xiàn)與CreateCompanyWithHttpRequestMessage方法幾乎相同。當然,這里我們創(chuàng)建了一個額外的uri參數(shù),并且我們沒有反序列化響應(yīng)正文內(nèi)容,因為它是空的。
在方法實現(xiàn)之后,讓我們從Execute方法中調(diào)用它:
public async Task Execute() { ... await UpdateCompanyWithHttpRequestMessage(); }
讓我們啟動應(yīng)用程序:
成功了。如果不放心也可以檢查一下數(shù)據(jù)庫。
使用HttpClient發(fā)送DELETE請求
由于DELETE請求是前面所有請求中最簡單的,所以我們只展示代碼。所以,讓我們首先看看如何發(fā)送一個帶有快捷方式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方法中調(diào)用這個方法:
public async Task Execute() { ... await DeleteCompany(); }
一旦我們運行客戶端應(yīng)用程序,我們就會得到204響應(yīng)。這是Web API中DELETE操作的有效響應(yīng)。
現(xiàn)在,讓我們看看如何使用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(); }
也沒什么新鮮的。我們?nèi)匀辉谡埱笾刑砑觓ccept頭。然后,我們必須在客戶端反序列化這些內(nèi)容。我們可以從Execute方法中調(diào)用這個方法并運行應(yīng)用程序,應(yīng)該會收到204狀態(tài)碼。
結(jié)論
因此,在本文中,我們學(xué)習(xí)了如何使用快捷方法和HttpRequestMessage類從客戶端應(yīng)用程序發(fā)送POST、PUT和DELETE請求。結(jié)合我們從上一篇文章中獲得的知識,我們已經(jīng)使用HttpClient類覆蓋了所有的CRUD方法。
在下一篇文章中,我們將更多地了解PATCH請求以及如何使用HttpClient發(fā)送它。
原文鏈接:https://code-maze.com/httpclient-example-aspnet-core-post-put-delete/
以上就是在ASP.NET Core中用HttpClient發(fā)送POST, PUT和DELETE請求的詳細內(nèi)容,更多關(guān)于ASP.NET Core中應(yīng)用HttpClient的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在ASP.Net?Core應(yīng)用程序中使用Bootstrap4
這篇文章介紹了在ASP.Net?Core應(yīng)用程序中使用Bootstrap4的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01ajaxToolkit:AccordionPane演示與應(yīng)用實例
ajaxToolkit:AccordionPane演示與應(yīng)用實例,需要的朋友可以參考一下2013-04-04解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題
這篇文章主要介紹了解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題的相關(guān)資料,需要的朋友可以參考下2016-09-09ASP.NET沒有魔法_ASP.NET MVC 模型驗證方法
下面小編就為大家分享一篇ASP.NET沒有魔法_ASP.NET MVC 模型驗證方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02Asp.net MVC 對所有用戶輸入的字符串字段做Trim處理的方法
這篇文章主要介紹了Asp.net MVC 如何對所有用戶輸入的字符串字段做Trim處理,需要的朋友可以參考下2017-06-06在asp.net(c#)下實現(xiàn)調(diào)用cmd的方法
通常情況下我們會用到調(diào)用cmd.exe來實現(xiàn)一些命令,例如 ping ,等等2012-01-01