前言
當下編寫應用程序都流行前后端分離,后端提供對應服務接口給前端或跨應用程序調(diào)用,如WebAPI等。在調(diào)用這些服務接口發(fā)送HTTP請求,而.NET為我們提供了HttpWebRequest、HttpClient幾個類庫來實現(xiàn)。下面對C#使用HttpClient類發(fā)送HTTP請求數(shù)據(jù)的幾種格式。
HttpClient
HttpClient是.NET 4.5以上版提供的類(System.Net.Http),編寫的應用程序可以通過此類發(fā)送HTTP請求并從WEB服務公開的資源接收HTTP響應。HTTP請求包含了請求報文與響應報文。下面先簡單的了解它的一些屬性與方法。屬性 | 描述 |
---|
BaseAddress | 獲取或設置發(fā)送請求時地址。 |
DefaultProxy | 獲取或設置全局HTTP請求代理。 |
DefaultRequestHeaders | 獲取請求發(fā)送的標題。 |
DefaultRequestVersion | 獲取或設置請求使用的默認HTTP版本。 |
MaxResponseContentBufferSize | 獲取或設置讀取響應內(nèi)容時要緩沖的最大字節(jié)數(shù)。 |
Timeout | 獲取或設置請求超時等待的時間。 |
方法 | 描述 |
---|
GetAsync | 異步請求獲取指定URI。 |
GetByteArrayAsync | 異步請求獲取指定URI并以字節(jié)數(shù)組的形式返回響應。 |
GetStreamAsync | 異步請求獲取指定URI并以流的形式返回響應。 |
GetStringAsync | 異步請求獲取指定URI并以字符串的形式返回響應正文。 |
PostAsync | 異步將POST請求發(fā)送給指定URI。 |
Send | 發(fā)送帶有指定請求的 HTTP 請求。 |
SendAsync | 以異步操作發(fā)送 HTTP 請求。 |
數(shù)據(jù)格式
在向HTTP發(fā)起請求時,將以什么樣的數(shù)據(jù)格式發(fā)送數(shù)據(jù),這取決于URI服務資源。而常用的類型可分為application/json、application/x-www-form-urlencoded, multipart/form-data, text/xml,其中application/json 是近年來最常用的一種。下面簡單介紹每種格式。
JSON數(shù)據(jù)格式
application/json 通常是HttpClient發(fā)送JSON格式的數(shù)據(jù),通過使用HttpContent的StringContent并設置其MediaType為"application/json"。using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Fountain.WinConsole.HttpDemo
{
internal class Program
{
static async Task Main(string[] args)
{
try
{
using (HttpClient httpClient = new HttpClient())
{
User user = new User();
user.username = "test";
user.password = "123456";
string jsonData = JsonConvert.SerializeObject(user);
// 發(fā)送請求數(shù)據(jù)包
StringContent content = new StringContent(jsonData, Encoding.UTF8);
// 設置HTTP 響應上的ContentType --application/json
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// 請求訪問地址
string url = "https://127.0.0.1/api/user/login";
// 發(fā)出HTTP的Post請求
HttpResponseMessage response = await httpClient.PostAsync(url, content);
// 讀取返回結果
string responseContent = await response.Content.ReadAsStringAsync();
// 將字符轉(zhuǎn)對象
Result result = JsonConvert.DeserializeObject<Result>(responseContent);
}
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
Console.ReadLine();
}
}
}
表單數(shù)據(jù)格式
application/x-www-form-urlencoded 這種格式通常用于表單數(shù)據(jù)的提交,通過使用HttpContent的FormUrlEncodedContent 類定義實現(xiàn)。using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Fountain.WinConsole.HttpDemo
{
internal class Program
{
static async Task Main(string[] args)
{
try
{
using (HttpClient httpClient = new HttpClient())
{
Dictionary<string,string> user = new Dictionary<string, string>
{
{ "username", "test" },
{ "password", "123456" }
};
// 發(fā)送請求數(shù)據(jù)包
FormUrlEncodedContent content = new FormUrlEncodedContent(user);
// 請求訪問地址
string url = "https://127.0.0.1/api/user/login";
// 發(fā)出HTTP的Post請求
HttpResponseMessage response = await httpClient.PostAsync(url, content);
// 讀取返回結果
string responseContent = await response.Content.ReadAsStringAsync();
// 將字符轉(zhuǎn)對象
Result result = JsonConvert.DeserializeObject<Result>(responseContent);
}
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
Console.ReadLine();
}
}
}
文件上傳格式
multipart/form-data 常用于文件上傳的數(shù)據(jù)格式,通過用MultipartFormDataContent類定義實現(xiàn)。using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Fountain.WinConsole.HttpDemo
{
internal class Program
{
static async Task Main(string[] args)
{
try
{
using (HttpClient httpClient = new HttpClient())
{
MultipartFormDataContent multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StringContent("user"), "test");
multipartContent.Add(new ByteArrayContent(File.ReadAllBytes(string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "test.jpg"))), "image", "test.jpg");
// 請求訪問地址
string url = "https://127.0.0.1/api/user/upload";
// 發(fā)出HTTP的Post請求
HttpResponseMessage response = await httpClient.PostAsync(url, multipartContent);
// 讀取返回結果
string responseContent = await response.Content.ReadAsStringAsync();
// 將字符轉(zhuǎn)對象
Result result = JsonConvert.DeserializeObject<Result>(responseContent);
}
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
Console.ReadLine();
}
}
}
XML數(shù)據(jù)格式
text/xml 主要用于傳輸XML格式的數(shù)據(jù),通過使用HttpContent 中的StringContent并設置其MediaType為"text/xml"。using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace Fountain.WinConsole.HttpDemo
{
internal class Program
{
static async Task Main(string[] args)
{
try
{
using (HttpClient httpClient = new HttpClient())
{
StringBuilder user = new StringBuilder();
user.AppendLine("<usrname>test</usrname>");
user.AppendLine("<password>test123456</password>");
string xmlData = user.ToString();
// 發(fā)送請求數(shù)據(jù)包
StringContent content = new StringContent(xmlData, Encoding.UTF8);
// 設置HTTP 響應上的ContentType --text/xml
content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
// 請求訪問地址
string url = "https://127.0.0.1/api/user/login";
// 發(fā)出HTTP的Post請求
HttpResponseMessage response = await httpClient.PostAsync(url, content);
// 讀取返回結果
string responseContent = await response.Content.ReadAsStringAsync();
// 將字符轉(zhuǎn)對象
Result result = JsonConvert.DeserializeObject<Result>(responseContent);
}
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
Console.ReadLine();
}
}
}
小結
以上是C#在使用HttpClient類發(fā)起 HTTP 的Post請求時,使用四種數(shù)據(jù)格式的方式。希望對各位有所幫助。如有不到之處,請多多包涵。
該文章在 2024/6/8 18:15:51 編輯過