C# 网络编程-关于请求头(Request Headers)和 响应头(Response Headers)作用(五)

以下是关于 HttpWebRequest请求头(Request Headers)响应头(Response Headers) 的详细说明,包括如何设置、读取及常见用法:

其实HttpClient 和 HttpWebRequest
在处理请求头和响应头方面有一些相似之处,但它们在使用方法和功能上存在一些差异。‌ 请求头和响应头的处理方式
‌HttpClient‌:

‌自定义请求头‌:HttpClient支持自定义HTTP请求头,这使得它能够更灵活地处理各种HTTP请求。通过设置HttpRequestMessage的Headers属性,可以添加或修改请求头‌

‌响应头信息‌:HttpClient在接收响应时,可以访问响应头信息,包括状态码和响应头。这使得开发者能够详细了解服务器的响应情况‌

‌HttpWebRequest‌:

‌自定义请求头‌:虽然HttpWebRequest也支持自定义HTTP请求头,但它的使用方式相对较为底层和复杂。开发者需要通过WebRequest.Create方法创建请求对象,并通过设置Headers属性来添加或修改请求头‌
‌响应头信息‌:HttpWebRequest在获取响应时,同样可以访问状态码和响应头信息,但整体使用过程相对繁琐‌


一、请求头(Request Headers)的设置

请求头用于向服务器传递客户端的附加信息(如身份验证、数据类型、客户端标识等)。可以通过 HttpWebRequest.Headers 属性或直接属性(如 ContentTypeAccept)进行设置。

1. 常见请求头设置示例
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.example.com");
request.Method = "POST";

// 设置通用请求头
request.Headers.Add("X-Custom-Header", "MyValue"); // 自定义头

// 设置用户代理(User-Agent)
request.UserAgent = "MyApp/1.0";

// 设置内容类型(Content-Type)
request.ContentType = "application/json"; // 通常用于POST/PUT请求

// 设置Accept头(告诉服务器期望的响应格式)
request.Accept = "application/json";

// 设置身份验证头(如Basic Auth)
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
request.Headers.Add("Authorization", $"Basic {credentials}");

// 设置超时头(可选)
request.Headers.Add("X-Request-Timeout", "5000"); // 示例自定义超时头
2. 常见请求头字段说明
头字段 用途
User-Agent 标识客户端(如浏览器或应用程序名称及版本)。
Content-Type 指定请求体的MIME类型(如 application/json, application/x-www-form-urlencoded)。
Accept 告知服务器客户端可接受的响应内容类型(如 application/json)。
Authorization 传递身份验证信息(如Basic Auth、Bearer Token)。
Referer 指示请求来源页面的URL。
Content-Length 请求体的字节长度(通常自动计算,但可手动设置)。
X-Requested-With 标识请求来源(如AJAX请求)。

二、响应头(Response Headers)的读取

响应头由服务器返回,包含关于资源元数据的信息(如内容类型、缓存策略、服务器信息等)。可以通过 HttpWebResponse.Headers 属性或直接属性(如 ContentType, StatusCode)读取。

1. 响应头读取示例
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // 读取状态码
    Console.WriteLine($"Status Code: {response.StatusCode}"); // 如 200 OK

    // 读取通用响应头
    string contentType = response.ContentType; // 获取内容类型(如application/json)
    string server = response.Server;           // 获取服务器软件(如nginx/1.20)
    
    // 读取自定义响应头
    string customHeader = response.Headers["X-Custom-Header"];
    
    // 读取所有头字段
    foreach (string header in response.Headers)
    {
        Console.WriteLine($"{header}: {response.Headers[header]}");
    }
}
2. 常见响应头字段说明
头字段 用途
Content-Type 响应内容的MIME类型(如 text/html, application/json)。
Content-Length 响应体的字节长度。
Server 服务器软件名称及版本(如 Apache/2.4.41)。
Set-Cookie 设置客户端Cookie(可能有多个)。
Location 重定向目标URL(3xx状态码时出现)。
Cache-Control 缓存策略(如 no-cache, max-age=3600)。
X-Powered-By 服务器后端技术(如 PHP/7.4.3)。

三、高级用法示例

1. 处理重定向(通过响应头 Location
try
{
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        // 正常处理响应
    }
}
catch (WebException ex) when (ex.Response != null)
{
    HttpWebResponse errorResponse = (HttpWebResponse)ex.Response;
    if (errorResponse.StatusCode == HttpStatusCode.Found) // 302重定向
    {
        string redirectUrl = errorResponse.Headers["Location"];
        Console.WriteLine($"Redirect to: {redirectUrl}");
        // 可以递归重定向处理
    }
}
2. 设置和读取JSON请求/响应
// 设置JSON请求头
request.ContentType = "application/json";
request.Accept = "application/json";

// 发送JSON数据
string jsonBody = "{\"key\":\"value\"}";
using (Stream stream = request.GetRequestStream())
using (StreamWriter writer = new StreamWriter(stream))
{
    writer.Write(jsonBody);
}

// 读取JSON响应
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    string contentType = response.ContentType; // 应为application/json
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        string jsonResult = reader.ReadToEnd();
        Console.WriteLine(jsonResult);
    }
}
3. 处理Cookie(通过响应头 Set-Cookie
// 保存响应中的Cookie
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // Cookie自动保存到cookieContainer
}

// 后续请求自动携带Cookie
request.CookieContainer = cookieContainer;

四、注意事项

  1. 头字段的大小写:HTTP头字段名不区分大小写,但通常使用驼峰或大写形式(如 X-Custom-Header)。
  2. 头字段的覆盖:如果多次设置相同头字段,Headers.Add 会追加值,而 Headers.Set 会覆盖。
  3. 自动处理的头:某些头字段(如 Content-LengthHost)由 HttpWebRequest 自动处理,无需手动设置。
  4. 安全性:敏感信息(如 Authorization 头)应通过HTTPS传输以防止泄露。

五、总结

  • 请求头:通过 HttpWebRequest.Headers 或直接属性设置,用于控制请求行为和传递元数据。
  • 响应头:通过 HttpWebResponse.Headers 或直接属性读取,用于获取服务器返回的元数据。
  • 常见场景:身份验证(Authorization)、数据格式协商(Content-Type)、客户端标识(User-Agent)、重定向处理(Location)等。

你可能感兴趣的:(C#,网络编程,c#,网络,开发语言)