欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在ASP.NET Core中應用HttpClient獲取數(shù)據和內容

 更新時間:2021年03月11日 10:56:02   作者:碼農譯站  
這篇文章主要介紹了在ASP.NET Core中集成和使用HttpClient獲取數(shù)據和內容,幫助大家更好的理解和學習使用ASP.NET Core,感興趣的朋友可以了解下

在本文中,我們將學習如何在ASP.NET Core中集成和使用HttpClient。在學習不同HttpClient功能的同時使用Web API的資源。如何從Web API獲取數(shù)據,以及如何直接使用HttpRequestMessage類來實現(xiàn)這些功能。在以后的文章中,我們將學習如何發(fā)送POST、PUT和DELETE請求,以及如何使用HttpClient發(fā)送PATCH請求。

要下載源代碼,可以訪問https://github.com/CodeMazeBlog/httpclient-aspnetcore/tree/fetching-data-with-httpclient以獲取項目。

概述

如果你打開HttpClient存儲庫的主分支,您將發(fā)現(xiàn)兩個項目:CompanyEmployees和CompanyEmployees. client。第一個項目是ASP.NET Core Web API項目,它將是本教程的服務器端項目。它由幾個項目組成:

API項目對于我們的文章和整個系列來說也不是最重要的。重要的是它使用SQL數(shù)據庫,所以你需要做的就是修改appsettings中的連接字符串。然后運行Update-Migration命令。所有需要的數(shù)據都將被遷移到數(shù)據庫中。

然后,還有客戶端應用程序——ASP.NET Core控制臺應用程序。它有一個單獨的服務HttpClientCrudService,我們將在本文中修改它,一個單獨的接口IHttpClientServiceImplementation,所有HttpClient服務都將從它繼承,數(shù)據傳輸類和一個修改過的Program類:

讓我們來看看Program類的當前代碼

class Program
{
 static async Task Main(string[] args)
 {
 var services = new ServiceCollection();
 ConfigureServices(services);
 var provider = services.BuildServiceProvider();
 try
 {
  await provider.GetRequiredService<IHttpClientServiceImplementation>()
  .Execute();
 }
 catch (Exception ex)
 {
  Console.WriteLine($"Something went wrong: {ex}");
 }
 }
 private static void ConfigureServices(IServiceCollection services)
 {
 services.AddScoped<IHttpClientServiceImplementation, HttpClientCrudService>();
 }
}

這沒有什么特別的。我們準備服務集合,將服務添加到IOC中,并從服務中執(zhí)行默認方法。當我們在整個教程中添加不同的服務時,我們將擴展ConfigureServices方法。

關于HttpClient

我們不會深入研究關于HttpClient的理論,因為我們將從示例中學到很多東西,但是讓我們看看一些基礎知識。

HttpClient是一個類,它允許我們發(fā)送HTTP請求,并從指定URI接收HTTP響應。我們可以使用這個類發(fā)送各種HTTP請求,如GET、POST、PUT、DELETE、PATCH并來自服務器的響應。

HttpClient使用HTTP消息處理程序發(fā)送請求并獲取響應。這是默認消息處理程序的主要工作。如果我們閱讀微軟的文檔,我們會讀到.NET Framework和.NET Core 2.0以及更早版本的默認是HttpClientHander。但是在.NET Core 2.1和更高版本中,默認的是SocketsHttpHandler。

但是,HttpClient不只是使用一個消息處理程序。我們可以附加多個消息處理程序并創(chuàng)建管道。有些處理程序只能操作請求的頭,有些可以處理超時,等等。

在ASP.NET Core中使用HttpClient發(fā)送GET請求

現(xiàn)在,讓我們從修改HttpClientCrudService 類開始:

public class HttpClientCrudService : IHttpClientServiceImplementation
{
 private static readonly HttpClient _httpClient = new HttpClient();
 public HttpClientCrudService()
 {
 _httpClient.BaseAddress = new Uri("https://localhost:5001/api/");
 _httpClient.Timeout = new TimeSpan(0, 0, 30);
 }
 public async Task Execute()
 {
 }
}

這里,我們創(chuàng)建了一個HttpClient屬性,初始化它,并在構造函數(shù)中進行配置,我們設置了API的URI及超時時間。當然,我們可以在這個配置中找到更多的屬性來使用,但是現(xiàn)在,這就足夠了。稍后,當我們開始學習HttpClientFactory時,我們將把這些配置移到別的地方。

現(xiàn)在,我們可以在這個類中添加一個新方法:

public async Task GetCompanies()
{
 var response = await _httpClient.GetAsync("companies");
 response.EnsureSuccessStatusCode();
 var content = await response.Content.ReadAsStringAsync();
 var companies = JsonSerializer.Deserialize<List<CompanyDto>>(content, _options);
}

在這個方法中,我們使用HttpClient中的GetAsync方法,并傳入地址。為了確保響應是成功的,我們調用EnsureSuccessStatusCode方法。一旦確定有成功狀態(tài)碼的響應,就可以將響應的內容作為字符串讀取。最后,我們對數(shù)據列表進行反序列化。如你所見,我們使用了一個JsonSerializerOptions類型的參數(shù),所以讓我們將它添加到我們的類中,并在Execute方法中調用這個方法:

private readonly JsonSerializerOptions _options; 

public HttpClientCrudService()
{
 _httpClient.BaseAddress = new Uri("https://localhost:5001/api/");
 _httpClient.Timeout = new TimeSpan(0, 0, 30);

 _options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
}

public async Task Execute()
{
 await GetCompanies();
}

我們?yōu)镴sonSerializer設置不區(qū)分大小寫的反序列化選項。沒有它,我們的響應就不會被正確地反序列化。

現(xiàn)在,我們可以在GetCompanies方法中添加一個斷點,啟動Web API項目,然后啟動客戶端:

正如我們所看到的,我們在companies變量中得到了結果。

支持不同的響應格式

在本例中,我們接收到一個JSON作為默認的響應格式。我們的API默認支持這種類型。但有些API不默認為JSON,它們可能支持XML作為默認的響應格式或任何其他格式。在這種情況下,我們的邏輯就行不通了。

除了JSON之外,我們的API還支持XML響應格式。讓我們看看如何在客戶端應用程序中明確地要求格式。

首先,Http請求和響應都包含一組頭,我們可以使用這些頭在客戶端和服務器應用程序之間傳遞附加信息。HTTP請求的通用頭是Accept。我們使用這個頭告訴服務器客戶端將接受哪種媒體類型:accept: application/json, text/xml。

所以,讓我們看看如何在我們的請求中設置頭:

public HttpClientCrudService()
{
 _httpClient.BaseAddress = new Uri("https://localhost:5001/api/");
 _httpClient.Timeout = new TimeSpan(0, 0, 30);
 _httpClient.DefaultRequestHeaders.Clear();
 _httpClient.DefaultRequestHeaders.Accept.Add(
 new MediaTypeWithQualityHeaderValue("application/json"));
 _httpClient.DefaultRequestHeaders.Accept.Add(
 new MediaTypeWithQualityHeaderValue("text/xml"));

 _options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
}

這里,我們使用DefaultRequestHeaders屬性并將其清除。然后,我們使用Accept屬性,由于它是一個集合,所以我們添加了兩個MediaTypeWithQualityHeaderValue對象。對于第一個對象,我們支持JSON格式,對于第二個對象,我們支持XML格式。為此,我們需要添加一個新的using語句:

using System.Net.Http.Headers;

現(xiàn)在,如果有一個像這樣的配置,必須在方法中添加一些額外的代碼,以決定如何反序列化響應:

public async Task GetCompanies()
{
 var response = await _httpClient.GetAsync("companies");
 response.EnsureSuccessStatusCode();

 var content = await response.Content.ReadAsStringAsync();
  
 var companies = new List<CompanyDto>();

 if(response.Content.Headers.ContentType.MediaType == "application/json")
 {
 companies = JsonSerializer.Deserialize<List<CompanyDto>>(content, _options);
 }
 else if(response.Content.Headers.ContentType.MediaType == "text/xml")
 {
 var doc = XDocument.Parse(content);
 foreach (var element in doc.Descendants())
 {
  element.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
  element.Name = element.Name.LocalName;
 }

 var serializer = new XmlSerializer(typeof(List<CompanyDto>));
 companies = (List<CompanyDto>)serializer.Deserialize(new StringReader(doc.ToString()));
 }
}

由于我們同時支持JSON和XML格式,我們必須檢查哪個ContentType被應用到響應。如果是JSON,我們只需執(zhí)行標準的反序列化。但如果是XML,我們將內容解析為XDocument。最后,我們創(chuàng)建一個新的XmlSerializer并反序列化XDocument。

此時,如果我們啟動兩個應用程序,并在方法中放置一個斷點,我們將看到我們的默認格式是JSON:

HttpClient中的優(yōu)先級

在我們的Accept頭設置中,我們支持兩種具有相同優(yōu)先級的格式。優(yōu)先級的最大值為1。但是,我們可以為這兩個頭文件中的一個設置較低的首選項——值必須在0到1之間。有較高值的請求將有更高優(yōu)先級。

所以,讓我們在構造函數(shù)中降低JSON Accept頭的優(yōu)先級:

_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(
 new MediaTypeWithQualityHeaderValue("application/json", 0.9));
_httpClient.DefaultRequestHeaders.Accept.Add(
 new MediaTypeWithQualityHeaderValue("text/xml"));

正如我們所看到的,MediaTypeWithQualityHeaderValue構造函數(shù)接受另一個參數(shù)。我們將它的值設置為0.9。因為我們沒有為XML Accept頭添加任何值,所以默認值是1。現(xiàn)在,如果我們開始我們的應用程序,我們會發(fā)現(xiàn)XML是優(yōu)先級更高的格式:

因此,執(zhí)行將跳過這一部分并執(zhí)行我們的XML反序列化。讓我們在XDocument解析之前檢查響應體:

然后,讓我們在解析操作之后檢查doc變量:

我們可以看出區(qū)別。在解析操作之后,反序列化就成功完成了:

我們已經看到了如何在請求中向HTTP Accept頭添加首選項。但現(xiàn)在問題出現(xiàn)了。如果我們使用部分請求頭,該怎么辦?

使用HttpRequestMessage類發(fā)送HTTP請求

在這個實現(xiàn)中,我們對每個請求使用相同的頭配置。因此,如果想發(fā)送默認為JSON格式的HTTP請求,我們不能使用這個類中的HTTP配置來實現(xiàn)。這是因為我們將XML格式設置為默認格式。這意味著我們必須提供一個不同的解決方案。

如果我們仔細考慮這一點,我們可以得出結論:BaseAddress和Timeout屬性與HttpClient相關,但Accept頭的屬性連接到請求本身。同樣,當我們使用GetAsync方法時,它在內部使用GET HTTP方法創(chuàng)建了一個新的HttpRequestMessage。也就是說,我們可以創(chuàng)建自己的HttpRequestMessage并為該請求提供報頭。

最佳實踐是在HttpClient實例上設置默認配置,在HTTP請求本身上設置請求配置。當然,如果我們總是希望使用JSON格式作為Accept報頭,我們可以在HttpClient設置它。

實現(xiàn)

現(xiàn)在,讓我們看看如何使用HttpRequestMessage類來實現(xiàn)HTTP請求。

首先,讓我們從構造函數(shù)中移除accept頭文件的配置:

public HttpClientCrudService()
{
 _httpClient.BaseAddress = new Uri("https://localhost:5001/api/");
 _httpClient.Timeout = new TimeSpan(0, 0, 30);
 _httpClient.DefaultRequestHeaders.Clear();
 _options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
}

然后,我們可以將GetCompanies方法恢復到之前:

public async Task GetCompanies()
{
 var response = await _httpClient.GetAsync("companies");
 response.EnsureSuccessStatusCode();
 var content = await response.Content.ReadAsStringAsync(); 
 var companies = JsonSerializer.Deserialize<List<CompanyDto>>(content, _options);
}

最后,我們可以添加新方法:

public async Task GetCompaniesWithXMLHeader()
{
 var request = new HttpRequestMessage(HttpMethod.Get, "companies");
 request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
 var response = await _httpClient.SendAsync(request);
 response.EnsureSuccessStatusCode();
 var content = await response.Content.ReadAsStringAsync();
 var doc = XDocument.Parse(content);
 foreach (var element in doc.Descendants())
 {
 element.Attributes().Where(a => a.IsNamespaceDeclaration).Remove();
 element.Name = element.Name.LocalName;
 }
 var serializer = new XmlSerializer(typeof(List<CompanyDto>));
 var companies = (List<CompanyDto>)serializer.Deserialize(new StringReader(doc.ToString()));
}

因此,我們使用HttpRequestMessage類創(chuàng)建了一個新請求,該類提供了HTTP Method作為參數(shù)和API的地址。然后,向請求添加報頭,并調用SendAsync方法發(fā)送請求。提取內容之后,重復前面方法中所做的步驟。我們還要做最后一件事。

讓我們確保一旦客戶端應用程序啟動,這個方法就會被調用:

public async Task Execute(){ //await GetCompanies(); await GetCompaniesWithXMLHeader();}

正如我們之前所做的,我們將在這個方法中放置一個斷點并啟動兩個應用程序:

如你所見,我們得到的結果與前面相同,但這次我們使用HttpRequestMessage的單獨方法發(fā)送帶有XML Accept頭的HTTP請求。

結論

在本文中,我們討論了HttpClient,以及如何在我們的ASP.NET Core中使用它處理來自Web API的數(shù)據。

原文鏈接:https://code-maze.com/fetching-data-with-httpclient-in-aspnetcore/

以上就是在ASP.NET Core中集成和使用HttpClient獲取數(shù)據和內容的詳細內容,更多關于ASP.NET Core中集成和使用HttpClient的資料請關注腳本之家其它相關文章!

相關文章

  • 基于.NET的FluentValidation數(shù)據驗證實現(xiàn)

    基于.NET的FluentValidation數(shù)據驗證實現(xiàn)

    這篇文章主要介紹了基于.NET的FluentValidation數(shù)據驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • asp.net 2.0里也可以用JSON的使用方法

    asp.net 2.0里也可以用JSON的使用方法

    本人找到一份,可以在asp.net2.0里實現(xiàn)JSON方式傳送數(shù)據的方法。但是原方法,不能在數(shù)據中帶有{、}、[、]、"等,所以我做特意做了轉意。
    2010-03-03
  • ASP.NET Core MVC 中實現(xiàn)中英文切換的示例代碼

    ASP.NET Core MVC 中實現(xiàn)中英文切換的示例代碼

    這篇文章主要介紹了ASP.NET Core MVC 中實現(xiàn)中英文切換的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 常用JavaScript代碼提示公共類封裝

    常用JavaScript代碼提示公共類封裝

    常用JavaScript代碼提示公共類整理封裝,可直接用于項目開發(fā), 作為開發(fā)常用代碼,還是有一定使用價值的,呵呵
    2009-08-08
  • 基于.Net?Core認證授權方案之JwtBearer認證

    基于.Net?Core認證授權方案之JwtBearer認證

    這篇文章介紹了基于.Net?Core認證授權方案之JwtBearer認證,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • ASP.NET學習CORE中使用Cookie身份認證方法

    ASP.NET學習CORE中使用Cookie身份認證方法

    本篇文章主要給大家詳細分析了ASP.NET學習CORE中使用Cookie身份認證方法以及相關的實例代碼,有需要的朋友參考下吧。
    2018-01-01
  • asp.net使用WebAPI和EF框架結合實現(xiàn)數(shù)據的基本操作

    asp.net使用WebAPI和EF框架結合實現(xiàn)數(shù)據的基本操作

    這篇文章介紹了asp.net使用WebAPI和EF框架結合實現(xiàn)數(shù)據基本操作的案例,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • .net core異常中間件的使用

    .net core異常中間件的使用

    本文主要簡單介紹一下異常中間件的使用,學習.net core的同學可以了解下本文
    2021-06-06
  • asp.net大文件上傳解決方案實例代碼

    asp.net大文件上傳解決方案實例代碼

    在本篇文章里小編給大家整理的是關于asp.net大文件上傳解決方案以及相關實例代碼,有需要的朋友們學習下。
    2019-09-09
  • ASP.NET MVC數(shù)組模型綁定詳解

    ASP.NET MVC數(shù)組模型綁定詳解

    這篇文章主要為大家詳細介紹了ASP.NET MVC數(shù)組模型綁定的相關資料,感興趣的小伙伴們可以參考一下
    2016-04-04

最新評論