前言

当下编写应用程序都流行前后端分离,后端提供对应服务接口给前端或跨应用程序调用,如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 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);
                    // 发送请求数据包
                    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";
                    // 发出HTTP的Post请求
                    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);
            }
            Console.ReadLine();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
表单数据格式

application/x-www-form-urlencoded 这种格式通常用于表单数据的提交,通过使用HttpContent的FormUrlEncodedContent 类定义实现。

示例:

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" }
                    };
                    // 发送请求数据包
                    FormUrlEncodedContent content = new FormUrlEncodedContent(user);
                    // 请求访问地址
                    string url = "https://127.0.0.1/api/user/login";
                    // 发出HTTP的Post请求
                    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);
            }
            Console.ReadLine();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
文件上传格式

multipart/form-data 常用于文件上传的数据格式,通过用MultipartFormDataContent类定义实现。

示例:

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";
                    // 发出HTTP的Post请求
                    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);
            }
            Console.ReadLine();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
XML数据格式

text/xml 主要用于传输XML格式的数据,通过使用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();
                    // 发送请求数据包
                    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";
                    // 发出HTTP的Post请求
                    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);
            }
            Console.ReadLine();
        }
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.