前言
当下编写应用程序都流行前后端分离,后端提供对应服务接口给前端或跨应用程序调用,如WebAPI等。在调用这些服务接口发送HTTP请求,而.NET为我们提供了HttpWebRequest、HttpClient几个类库来实现。下面对C#使用HttpClient类发送HTTP请求数据的几种格式。
HttpClient
HttpClient是.NET 4.5以上版提供的类(System.Net.Http),编写的应用程序可以通过此类发送HTTP请求并从WEB服务公开的资源接收HTTP响应。HTTP请求包含了请求报文与响应报文。下面先简单的了解它的一些属性与方法。
属性:
属性 | 描述 |
---|
BaseAddress | 获取或设置发送请求时地址。 |
DefaultProxy | 获取或设置全局HTTP请求代理。 |
DefaultRequestHeaders | 获取请求发送的标题。 |
DefaultRequestVersion | 获取或设置请求使用的默认HTTP版本。 |
MaxResponseContentBufferSize | 获取或设置读取响应内容时要缓冲的最大字节数。 |
Timeout | 获取或设置请求超时等待的时间。 |
方法:
方法 | 描述 |
---|
GetAsync | 异步请求获取指定URI。 |
GetByteArrayAsync | 异步请求获取指定URI并以字节数组的形式返回响应。 |
GetStreamAsync | 异步请求获取指定URI并以流的形式返回响应。 |
GetStringAsync | 异步请求获取指定URI并以字符串的形式返回响应正文。 |
PostAsync | 异步将POST请求发送给指定URI。 |
Send | 发送带有指定请求的 HTTP 请求。 |
SendAsync | 以异步操作发送 HTTP 请求。 |
数据格式
在向HTTP发起请求时,将以什么样的数据格式发送数据,这取决于URI服务资源。而常用的类型可分为application/json、application/x-www-form-urlencoded, multipart/form-data, text/xml,其中application/json 是近年来最常用的一种。下面简单介绍每种格式。
JSON数据格式
application/json 通常是HttpClient发送JSON格式的数据,通过使用HttpContent的StringContent并设置其MediaType为"application/json"。
示例:
| using System.Net.Http.Headers; |
| using System.Threading.Tasks; |
| namespace Fountain.WinConsole.HttpDemo |
| static async Task Main(string[] args) |
| using (HttpClient httpClient = new HttpClient()) |
| string jsonData = JsonConvert.SerializeObject(user); |
| StringContent content = new StringContent(jsonData, Encoding.UTF8); |
| content.Headers.ContentType = new MediaTypeHeaderValue("application/json") |
| string url = "https://127.0.0.1/api/user/login"; |
| HttpResponseMessage response = await httpClient.PostAsync(url, content); |
| string responseContent = await response.Content.ReadAsStringAsync(); |
| Result result = JsonConvert.DeserializeObject<Result>(responseContent); |
| catch (Exception exception) |
| Console.WriteLine(exception.Message); |
复制
表单数据格式
application/x-www-form-urlencoded 这种格式通常用于表单数据的提交,通过使用HttpContent的FormUrlEncodedContent 类定义实现。
示例:
| using Newtonsoft.Json.Linq; |
| using System.Collections; |
| using System.Collections.Generic; |
| using System.Net.Http.Headers; |
| using System.Threading.Tasks; |
| namespace Fountain.WinConsole.HttpDemo |
| static async Task Main(string[] args) |
| using (HttpClient httpClient = new HttpClient()) |
| Dictionary<string,string> user = new Dictionary<string, string> |
| FormUrlEncodedContent content = new FormUrlEncodedContent(user); |
| string url = "https://127.0.0.1/api/user/login"; |
| HttpResponseMessage response = await httpClient.PostAsync(url, content); |
| string responseContent = await response.Content.ReadAsStringAsync(); |
| Result result = JsonConvert.DeserializeObject<Result>(responseContent); |
| catch (Exception exception) |
| Console.WriteLine(exception.Message); |
复制
文件上传格式
multipart/form-data 常用于文件上传的数据格式,通过用MultipartFormDataContent类定义实现。
示例:
| using Newtonsoft.Json.Linq; |
| using System.Collections; |
| using System.Collections.Generic; |
| using System.Net.Http.Headers; |
| using System.Threading.Tasks; |
| namespace Fountain.WinConsole.HttpDemo |
| static async Task Main(string[] args) |
| 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"; |
| HttpResponseMessage response = await httpClient.PostAsync(url, multipartContent); |
| string responseContent = await response.Content.ReadAsStringAsync(); |
| Result result = JsonConvert.DeserializeObject<Result>(responseContent); |
| catch (Exception exception) |
| Console.WriteLine(exception.Message); |
复制
XML数据格式
text/xml 主要用于传输XML格式的数据,通过使用HttpContent 中的StringContent并设置其MediaType为"text/xml"。
示例:
| using Newtonsoft.Json.Linq; |
| using System.Collections; |
| using System.Collections.Generic; |
| using System.Net.Http.Headers; |
| using System.Threading.Tasks; |
| namespace Fountain.WinConsole.HttpDemo |
| static async Task Main(string[] args) |
| using (HttpClient httpClient = new HttpClient()) |
| StringBuilder user = new StringBuilder(); |
| user.AppendLine("<usrname>test</usrname>"); |
| user.AppendLine("<password>test123456</password>"); |
| string xmlData = user.ToString(); |
| StringContent content = new StringContent(xmlData, Encoding.UTF8); |
| content.Headers.ContentType = new MediaTypeHeaderValue("text/xml") |
| string url = "https://127.0.0.1/api/user/login"; |
| HttpResponseMessage response = await httpClient.PostAsync(url, content); |
| string responseContent = await response.Content.ReadAsStringAsync(); |
| Result result = JsonConvert.DeserializeObject<Result>(responseContent); |
| catch (Exception exception) |
| Console.WriteLine(exception.Message); |
复制