Sử dụng lớp HttpClient để triển khai các truy vấn HTTP, thực hiện phương thức GET và POST với cách tiến hành SendAsync, tùy chỉnh các loại content trong HTTP Request như FormUrlEncodedContent, StringContent, MultipartFormDataContent
Giới thiệu HttpClient
Lớp HttpClient được áp dụng để gởi truy vấn HTTP (Http Request Message - Request) với nhận ý kiến Response (Http Response Message) từ những truy vấn đó. Lớp này nằm trong namespace System.Net.Http, namespace này chứa những lớp giúp tạo ra sự liên lạc thân client cùng server. Để làm việc với HttpClient dùng các namespace sau:
using System;using System.Linq;using System.Net;using System.Net.Http;using System.Net.Http.Headers;using System.Threading;using System.Threading.Tasks;using System.IO;using System.Text; Phần này thực hiện thao tác với giao thức HTTP đề nghị trước tiên cần nắm rõ về giao thức này, hãy tham khảo kỹ phần Giao thức HTTP và add Uri, Url ở phần kết cấu Uri, Url, Lớp Uri vào C#
Tạo tầm nã vấn GET bất đồng điệu với HttpClient
Để tạo ra truy vấn GET cho tới một add URL, tiến hành phương thức GetAsync(url), đấy là phương thức async khi hoàn thành nó trả về đối tượng HttpResponseMessage. Từ đối tượng người sử dụng này ta đã biết hiệu quả truy vấn, và ta rất có thể đọc được tài liệu tải về.
Bạn đang xem: Thiết kế restful api + gọi api bằng httpclient trong asp
// Khởi tạo http clientusing var httpClient = new HttpClient();// tùy chỉnh cấu hình các Header trường hợp cầnhttpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml+json");// triển khai truy vấn GETHttpResponseMessage response = await httpClient.GetAsync(url); khi có đối tượng lớp HttpResponseMessage có thể thực hiện những tác vụ gọi dữ liệu, tham khảo một số thuộc tính cùng phương thức:
EnsureSuccessStatusCode() | Phát sinh Exception giả dụ truy vấn có mã trả về không thành công xuất sắc (khi ở trong tính IsSuccessStatusCode là false) |
IsSuccessStatusCode | Nhận true lúc mã trả về thành công, ví dụ mã tinh thần StatusCode nhận quý hiếm 200 |
StatusCode | Thuộc tính tất cả kiểu enum HttpStatusCode cho biết thêm mã tinh thần của tác dụng (Như 301 - MovedPermanently, 200 - OK, 404 - NotFound ...), để đưa sang số nguyên (int)HttpStatusCode |
ReasonPhrase | Đoạn text, mô tả thông tin cho mã trạng thái như OK, MovedPermanently ... |
Headers | HttpResponseHeaders Ví dụ kiến tạo phương thực để hiện thị toàn bộ các header /// In ra thông tin các Header của HTTP Responsepublic static void ShowHeaders(HttpHeaders headers) Console.WriteLine("CÁC HEADER:"); foreach (var header in headers) foreach (var value in header.Value) Console.WriteLine($"header.Key,25 : value"); Console.WriteLine(); |
Content | Thuộc tính đẳng cấp HttpContent, trong các số đó chứa văn bản (content) và những header tương quan đến nội dung nếu gồm (Headers như Content-Type, Content-Length ...), một vài phương thức để lấy content: ReadAsStringAsync đọc ngôn từ (content) HTTP trả về chuỗi (có encoding). Đối với cách tiến hành này, một vài server trả về mã CharSet nhưng .NET vi xử lý core không phân biệt sẽ khiến lỗi, để encoding được mang đến trường phù hợp này thì trước lúc thi hành tùy chỉnh cấu hình cho nó: Content.Headers.ContentType.CharSet = |
/// In ra thông tin các Header của HTTP Responsepublic static void ShowHeaders(HttpHeaders headers) Console.WriteLine("CÁC HEADER:"); foreach (var header in headers) foreach (var value in header.Value) Console.WriteLine($"header.Key,25 : value"); Console.WriteLine(); // thiết lập về trang web và trả về chuỗi nội dungpublic static async Task GetWebContent(string url) // Khởi sản xuất http client using var httpClient = new HttpClient(); // tùy chỉnh các Header nếu cần httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml+json"); try // tiến hành truy vấn GET HttpResponseMessage response = await httpClient.GetAsync(url); // hiện nay thị tin tức header trả về ShowHeaders(response.Headers); // tạo nên Exception ví như mã trạng thái trả về là lỗi response.EnsureSuccessStatusCode(); Console.WriteLine($"Tải thành công xuất sắc - statusCode (int)response.StatusCode response.ReasonPhrase"); Console.WriteLine("Starting read data"); // Đọc nội dung nội dung trả về - ĐỌC CHUỖI NỘI DUNG string htmltext = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Nhận được htmltext.Length ký kết tự"); Console.WriteLine(); return htmltext; catch (Exception ex) Console.WriteLine(ex.Message); return null; Khi sử dụng, như trong cách làm Main (chú ý gửi sang sự không tương đồng bộ)
static async Task Main(string<> args) var c = await GetWebContent("https://www.google.com/search?q=darkedeneurope.com"); Console.WriteLine(c);

ReadAsStreamAsync và ReadAsByteArrayAsync gọi nội dung
Ở lấy ví dụ như trên, đã dùng ReadAsStringAsync để đọc content convert thành chuỗi (string). Quanh đó ra, cũng có thể sử dụng ReadAsStreamAsync để chế tạo ra stream nhằm đọc kết quả và thực hiện ReadAsByteArrayAsync nhằm đọc hết những byte (mảng các byte) trong content.
Xem thêm: Sự Khác Biệt Giữa Não Phải Não Trái Và Phải, 2 Bán Cầu Não
Ví dụ sử dụng ReadAsByteArrayAsync
Xây dựng cách thức đọc tài nguyên xuất phát từ một url cùng trả về mảng byte là content
var url = "https://raw.githubusercontent.com/darkedeneurope.comnet/jekyll-example/master/images/jekyll-01.png";byte<> bytes = await DownloadDataBytes(url);string filepath = "anh1.png";using (var stream = new FileStream (filepath, FileMode.Create, FileAccess.Write, FileShare.None)) stream.Write (bytes, 0, bytes.Length); Console.WriteLine("save " + filepath);Khi sủ dụng, rất có thể lưu tổng thể dữ liệu mảng byte ra file. Ví dụ mua một file ảnh về:
static async Task Main(string<> args) var url = "https://raw.githubusercontent.com/darkedeneurope.comnet/jekyll-example/master/images/jekyll-01.png"; byte<> bytes = await DownloadDataBytes(url); string filepath = "anh1.png"; using (var stream = new FileStream (filepath, FileMode.Create, FileAccess.Write, FileShare.None)) stream.Write (bytes, 0, bytes.Length); Console.WriteLine("save " + filepath);
Ví dụ sử dụng DownloadDataStream
DownloadDataStream trả về một Stream nhằm đọc Content, lấy ví dụ xây dựng cách làm tải một tệp tin ảnhtừ url mang đến trước.// sở hữu từ url, trả về stream nhằm đọc dữ liệu (xem bài xích về stream)public static async Task DownloadDataStream (string url, string filename) var httpClient = new HttpClient(); Console.WriteLine ($"Starting connect url"); try HttpResponseMessage response = await httpClient.GetAsync (url); response.EnsureSuccessStatusCode (); // mang Stream nhằm đọc content using var stream = await response.Content.ReadAsStreamAsync(); // THỰC HIỆN ĐỌC nội dung int SIZEBUFFER = 500; using var streamwrite = File.OpenWrite (filename); // Mở stream để lưu file byte<> buffer = new byte
static async Task Main(string<> args) var url = "https://raw.githubusercontent.com/darkedeneurope.comnet/linux-centos/master/docs/samba1.png"; await DownloadDataStream(url, "anh2.png"); xem thêm mã mối cung cấp HttpClientExampleRead (git) hoặc cài đặt về ex029-2
Tạo request với SendAsync
Ngoài cách làm GetAsync giữ hộ Request với cách tiến hành GET ngơi nghỉ trên ra, có thể dùng cách làm SendAsync (hoặc Send nếu sử dụng code đồng hóa synchronous).
var httpRequestMessage = new HttpRequestMessage();httpRequestMessage.Method = HttpMethod.Post;httpRequestMessage.RequestUri = new Uri("https://darkedeneurope.com");/... Sau khoản thời gian tạo được HttpRequestMessage gồm thể tùy chỉnh thiết lập nhiều thông tin như, tùy chỉnh thiết lập method với thuộc tính Method (giá trị GET, POST, DELETE ...), thiết lập add truy vấn với thuộc tính RequestUri, thiết lập cấu hình Content của tầm nã vấn với content ...
Sau đó hoàn toàn có thể thực hiện tại truy vấn để trả về HttpResponseMessage
var response = await httpClient.SendAsync(request);
Sử dụng FormUrlEncodedContent
Để tùy chỉnh cấu hình Content trong HttpRequestMessage nhằm gửi cho server thì cấu hình thiết lập thuộc tínhContent bằng các đối tượng thuộc những lớp như: FormUrlEncodedContent,StringContent,Với FormUrlEncodedContent chúng ta có thể tạo nội dung tương ứng như một size HTML,nó chứa những giá trị (key/value) vẫn Post đến Server. Lấy một ví dụ sau, nó post cho server hai giá bán trịtương ứng key với value là key1/value1 (có thể hiểu tương ứng với bộ phận HTML Input có name là key1 với value là value1) với key2/value2 (trường hòa hợp này chứa nhiều giá trị, khớp ứng với HTML Multi Select)
static async Task Main(string<> args) var httpClient = new HttpClient(); var httpRequestMessage = new HttpRequestMessage(); httpRequestMessage.Method = HttpMethod.Post; httpRequestMessage.RequestUri = new Uri("https://postman-echo.com/post"); var parameters = new List>(); parameters.Add(new KeyValuePair("key1","value1")); parameters.Add(new KeyValuePair("key2","value2-1")); parameters.Add(new KeyValuePair("key2","value2-2")); // thiết lập cấu hình Content var nội dung = new FormUrlEncodedContent(parameters); httpRequestMessage.Content = content; // thực hiện Post var response = await httpClient.SendAsync(httpRequestMessage); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent);// khi chạy hiệu quả trả về cho biết thêm Server đã nhận được dữ liệu Post đến
Sử dụng StringContent
rất có thể gán nội dung bằng đối tượng người dùng kiểu StringContent đựng chuỗi câu chữ (sử dụng bí quyết này để tạo thành truy vấn Webservice API với content là JSON)static async Task Main(string<> args) var httpClient = new HttpClient(); var httpRequestMessage = new HttpRequestMessage(); httpRequestMessage.Method = HttpMethod.Post; httpRequestMessage.RequestUri = new Uri("https://postman-echo.com/post"); // tạo ra StringContent string jsoncontent = ""value1": "giatri1", "value2": "giatri2""; var httpContent = new StringContent(jsoncontent, Encoding.UTF8, "application/json"); httpRequestMessage.Content = httpContent; var response = await httpClient.SendAsync(httpRequestMessage); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent);
Sử dụng MultipartFormDataContent
chúng ta cũng có thể gán nội dung bằng đối tượng người dùng kiểu MultipartFormDataContent, nhằm post tài liệu nhiều thành phần (multipart/form-data), vừa có tài liệu như các phần tử của HTML size vừa hoàn toàn có thể kèm file.Ví dụ, tạo thành truy vấn tương tự như form HTML post những dữ liệu: tất cả file đính thêm kèm, có hai phần tử
var httpClient = new HttpClient();var httpRequestMessage = new HttpRequestMessage();httpRequestMessage.Method = HttpMethod.Post;httpRequestMessage.RequestUri = new Uri("https://postman-echo.com/post");// Tạo đối tượng người sử dụng MultipartFormDataContentvar content = new MultipartFormDataContent();// chế tạo ra StreamContent đựng nội dung file upload, kế tiếp đưa vào contentStream fileStream = System.IO.File.OpenRead("Program.cs");content.Add(new StreamContent(fileStream), "fileupload", "abc.xyz");// phân phối MultipartFormDataContent một StringContentcontent.Add(new StringContent("value1"), "key1");// Thêm phần tử chứa mạng quý giá (HTML Multi Select)content.Add(new StringContent("value2-1"), "key2<>");content.Add(new StringContent("value2-2"), "key2<>");httpRequestMessage.Content = content;var response = await httpClient.SendAsync(httpRequestMessage);var responseContent = await response.Content.ReadAsStringAsync();Console.WriteLine(responseContent); xem thêm mã mối cung cấp HttpClientExampleSendAsync (git) hoặc sở hữu về ex031