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

​​​​​​​

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM