1. 程式人生 > >在ASP.NET Core中用HttpClient(二)——傳送POST, PUT和DELETE請求

在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