ASP.NET Core 知识速递 - Day 7:每天进步一点

文摘   2024-10-15 08:24   日本  

这一节我们来介绍HTTP Header,HTTP Header是包含以键值对形式表示的元数据,这些元数伴随HTTP 请求和响应一起发送。它们可以用于定义缓存行为、进行身份验证以及管理会话状态。HTTP Header帮助 API 客户端和服务器更高效地进行通信,并使开发人员能够优化和自定义 API 的行为。

HTTP 头在请求和响应周期中对于服务器和客户端的行为起着至关重要的作用。请求头由客户端发送给服务器,包含与请求资源相关的信息和指令,而响应头由服务器发送给客户端,提供有关响应本身的元数据、指令和附加信息。
常用的请求Header:
Accept
Accept 定义了客户端能够从服务器接受的媒体类型。例如,Accept: application/json, text/html 表示客户端偏好接收 JSON 或 HTML 响应。这些信息让服务器能够发送符合客户端需求的资源表示。
User-Agent
User-Agent 表示发出请求的网页浏览器或客户端应用程序,使服务器能够根据客户端的情况调整其响应。例如,如果 User-Agent 头显示请求来自 Chrome 浏览器,服务器可能会包含适用于 Chrome 的 CSS 前缀,以提高兼容性。
Authorization
Authorization 用于在客户端尝试访问受保护资源时向服务器发送客户端的凭据。例如,客户端可能在头中包含一个 JSON Web Token (JWT),服务器会验证该令牌后再返回请求的资源。
Content-Type
Content-Type 标识请求主体中的内容的媒体类型。例如,Content-Type: application/json 表示请求主体包含的是 JSON 数据。这些信息帮助服务器成功解析并处理负载数据。
Cookie
客户端可以使用 Cookie 头将先前存储的 cookies 发送回服务器,服务器使用这些 cookies 将请求与特定的用户或会话相关联。它提供个性化体验中发挥着重要作用,能够让服务器记住用户的登录状态或语言偏好。
常用的响应头:

Content-Type

Content-Type 响应头是 Content-Type 请求头的对应项,它表明服务器发送给客户端的数据类型。头值通常包括媒体类型(如 text/html,application/json,image/jpeg和audio/mp3),以及任何可选参数。

Cache-Control

Cache-Control 控制客户端浏览器或中间缓存中的缓存行为。它定义了响应的缓存方式、过期时间以及如何重新验证。例如,Cache-Control: max-age=3600, public 指示客户端将响应缓存最多 3600 秒(1 小时),并允许公共缓存进行缓存。

Server
Server 包含生成响应的服务器软件名称和版本,以及有关服务器技术栈的信息。例如,Server: Apache/2.4.10 (Unix) 表示响应是由 Apache 2.4.10 版的服务器生成的。需要注意的是,Server 头是信息,不会影响 API 的功能。
Set-Cookie
Set-Cookie 指示客户端存储一个具有指定名称、值和附加属性(如过期时间、域、路径和安全标志)的 cookie。客户端随后会在后续请求中包含该 cookie,以便实现有状态的通信和个性化体验。
Content-Length

Content-Length 指定响应主体的大小(以字节为单位),这有助于客户端预期将要接收的数据量。通过允许客户端提前规划以更有效地分配内存和处理数据,这可以提升性能。

在ASP.NET Core中如何获取请求的Header呢?我们通过例子做演示,创建一个ASP.NET Core 空项目模板,添加如下代码:

var app = WebApplication.Create();app.Run(async context =>{    context.Response.Headers.Append("content-type", "text/html");    await context.Response.WriteAsync("<h1>Request Headers</h1>");    await context.Response.WriteAsync("<ul>");    foreach (var h in context.Request.Headers)    {        await context.Response.WriteAsync($"<li>{h.Key} : {h.Value}</li>");    }    await context.Response.WriteAsync("</ul>");
});app.Run();

运行结果如下:

我们可以使用上面代码获取请求中的Header。此外微软还给我们提供了一个HeaderNames类,位于Microsoft.Net.Http.Headers程序集的Microsoft.Net.Http.Headers命名空间中,该类包含了大部分常用的Header,我们将这些Header打印出来,添加如下代码:
List<FieldInfo> GetConstants(Type type){    FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);    return fieldInfos.ToList();}
    await context.Response.WriteAsync("<h1>Request Headers from Microsoft.Net.Http.Headers.HeaderNames</h1>");    await context.Response.WriteAsync("<ul>");    foreach (var h in GetConstants(typeof(HeaderNames)))    {        await context.Response.WriteAsync($"<li>{h.Name} = {h.GetValue(h)}</li>");    }    await context.Response.WriteAsync("</ul>");
我们使用上面代码获取HeaderNames类的Header并将字段名称和值打印出来。
运行效果如下:


源代码地址:
https://github.com/bingbing-gui/AspNetCore-Skill/tree/master/src/aspnetcore-knowledge-point/request-header

桂迹
分享原创,记录痕迹!
 最新文章