在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/
&n