详解http请求头,响应头以及在实际开发中

HTTP (Hypertext Transfer Protocol) 协议是一种用于传输超文本的标准协议,它是 Web 通信的基础。HTTP 协议是无状态的,即每次请求是相互独立的,服务器不会记住上一次请求的信息。HTTP 协议采用客户端-服务器模式,客户端发起请求,服务器响应请求,并将响应返回给客户端。

HTTP 协议主要分为以下两个部分:

1.请求:客户端向服务器发送请求,请求包含以下内容:

  • 请求方法:GET、POST 等等
  • 请求 URL:指明请求的资源的位置
  • HTTP 版本:指明请求遵循的 HTTP 协议版本
  • 消息头:包含请求的元信息,比如客户端接受的数据类型等
  • 消息体:客户端发送的数据,比如表单数据等

2.响应:服务器收到请求后返回响应,响应也包含以下内容:

  • HTTP 版本:指明响应遵循的 HTTP 协议版本
  • 状态码:用于指定响应的状态,如 200 表示请求成功,404 表示请求的资源不存在等
  • 消息头:包含响应的元信息,比如服务器发送的数据类型等
  • 消息体:服务器返回的数据,比如 HTML 页面等

HTTP 协议的优点是简单、灵活、可扩展性强,但缺点是通信使用明文,数据容易被窃取或篡改。因此,HTTPS 出现了,它在 HTTP 协议基础上增加了加密与认证功能,使得通信更加安全。

本篇文章主要是对于请求头以及响应头的作用以及在实战中的使用 

在浏览器中查看

以edge为例,右键页面,点击检查,选择网络,就可以看到页面的请求信息

请求头(request header)

响应头(response header)

 

下面列举出一些http请求头头中常用的属性

字段解释
Accept指定客户端能够接收的内容类型
Accept-Charset浏览器可以接受的字符编码集
Accept-Language浏览器可接受的语言
Cache-Control指定请求和响应遵循的缓存机制
Connection表示是否需要持久连接
Cookie请求发送时附带的一个或多个Cookie
Host请求的服务器域名或IP地址
User-AgentUser-Agent头的内容包含发出请求的用户信息
Referer表示这个请求是从哪个网页来的,在日志分析、反盗链、统计分析等方面有用
Content-Type表示请求消息的实体部分的媒体类型
Content-Length表示请求消息的实体部分的长度
Origin用于发起一个跨域请求,即请求的服务器与当前页面的服务器不在同一域下
If-Modified-Since用于请求副本,仅在所请求的资源在指定时间后更新过才返回资源
If-None-Match当请求头带有If-None-Match时,服务器端会根据请求头中If-None-Match的值与当前页面的ETag是否一致来判断页面是否304
AuthorizationHTTP授权的授权证书
Accept-Encoding浏览器可以支持的压缩编码类型
Upgrade向服务器指定某种传输协议以便服务器进行转换(如果支持)
Range请求头指定第一个字节的位置和最后一个字节的位置来请求文件的一部分
TE客户端可以接受的传输编码,并通知服务器进行相应的编码
If-Range如果资源的ETag或Last-Modified时间与指定的相匹配,就返回一段内容,否则就返回整个内容
If-Match服务器将使用它验证整个资源的一个或多个部分是否未被更改
If-Modified-Since如果请求的部分在指定时间之后被修改,则请求成功,否则返回304
Expect请求头允许客户端列出特定的服务器行为,以便在客户端发送请求之前得到服务端的确认

下面列举出一些http响应头中常用的属性

字段名解释
Accept-Ranges服务器支持的资源范围
Age响应持续时间,服务器产生响应的时间与请求时间的差值
Cache-Control控制缓存的行为
Connection表示是否需要持久连接(HTTP 1.1默认启用持久连接)
Content-Encoding内容编码方式
Content-Language内容语言
Content-Length内容长度
Content-Location资源在网站中的位置
Content-MD5内容的MD5校验值
Content-Range内容响应的范围
Content-Type内容类型
Date响应的时间
ETag资源的实体标识
Expires资源过期的时间
Last-Modified资源的最后修改时间
Link资源其他相关资源的链接
Location重定向的地址
P3P指定P3P策略
Pragma控制缓存的行为
Proxy-Authenticate代理服务器要求客户端提供验证信息
Refresh自动刷新
Retry-After服务器暂时不可用,指定多久后重试
Server服务器的信息
Set-Cookie设置Cookie
Status响应状态码和状态文本
Trailer允许发送额外的头部
Transfer-Encoding指明传输编码方式
Upgrade指明支持协议的版本
Vary告知缓存机制,响应是否是特定用户代理的请求所匹配
Via经过的代理服务器
Warning应用的警告信息
WWW-Authenticate服务器要求客户端提供验证信息

开发中需要注意的字段

Cookie

一些不敏感的客户信息可以写在这个里面

User-Agent

可以用于监听用户设备的ip,例如限定用户账号可以登录几台设备

Content-Type

以下是常见的Content-Type及其对应的媒体类型:

Content-Type媒体类型
text/plain纯文本
text/htmlHTML文档
application/jsonJSON数据
application/xmlXML数据
image/jpegJPEG图像
image/pngPNG图像
audio/mpegMP3音频
video/mp4MP4视频

以下是一个简单的图表,展示了常见的Content-Type及其所表示的媒体类型:

Content-Type格式媒体类型示例
text/plain纯文本Hello, World!
text/htmlHTML文档<html><body><h1>Hello, World!</h1></body></html>
application/jsonJSON数据{"name":"John","age":30,"city":"New York"}
application/xmlXML数据<person><name>John</name><age>30</age><city>New York</city></person>
image/jpegJPEG图像(JPEG图片)
image/pngPNG图像(PNG图片)
audio/mpegMP3音频(MP3音频)
video/mp4MP4视频(MP4视频)

Authorization

这里可以存储认证信息,用于控制用户或应用程序对资源的访问。在Web应用程序中,通常使用标准的HTTP授权头来传递授权信息。常见的授权机制包括基本认证、摘要认证、OAuth和JSON Web Token等。

springboot修改响应头

方案一

例如,下面的代码演示了如何将响应头中的Content-Type设置为application/json:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@GetMapping("/myapi")public ResponseEntity<String> getMyApi() {HttpHeaders headers = new HttpHeaders();headers.add(HttpHeaders.CONTENT_TYPE, "application/json");return new ResponseEntity<>("{\"message\":\"hello world\"}", headers, HttpStatus.OK);}
}

在这个例子中,我们创建了一个HttpHeaders对象并将Content-Type设置为application/json,然后将其与响应正文和状态码一起传递给ResponseEntity构造函数。

当客户端调用/myapi时,响应头将包含Content-Type: application/json,而不是默认的Content-Type: text/plain。

方案二

在使用HttpServletRequest和HttpServletResponse对象处理HTTP请求和响应时,可以使用HttpServletResponse对象来对响应进行修改。下面是一个简单的例子,演示如何使用HttpServletResponse对象来设置响应头和响应内容:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 设置响应头response.setContentType("text/plain;charset=UTF-8");response.setHeader("Cache-Control", "no-cache");// 获取输出流PrintWriter out = response.getWriter();// 输出响应内容out.println("Hello World!");// 关闭输出流out.close();
}

在这个例子中,我们首先使用response.setContentType()方法设置响应的内容类型为"text/plain;charset=UTF-8",这样浏览器就知道如何正确解析响应内容。然后,我们使用response.setHeader()方法设置响应头的"Cache-Control"属性值为"no-cache",这样浏览器就不会缓存页面。最后,我们使用response.getWriter()方法获取输出流,然后使用PrintWriter对象的println()方法输出"Hello World!"作为响应内容,最后关闭输出流。

需要注意的是,在调用任何输出方法之前,必须先设置响应头和状态码,否则将会抛出IllegalStateException异常。例如,如果您不设置响应类型并尝试输出响应内容,就会抛出以下异常:

java.lang.IllegalStateException: Cannot call getWriter(), getOutputStream() already called

因此,请务必确保在使用HttpServletResponse对象之前正确设置响应头和状态码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/265370.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨JavaScript高阶编程技巧:突破技能瓶颈的高级实践

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 目录 学习目标&#xff1a; 学习内容&#xff1a…

ABeam Recruiting | ABeam旗下德硕管理咨询(深圳)最新社招岗位信息

ABeam Recruiting 职等你来 POSITION 招聘岗位 1 SAP项目经理 &#xff08;FICO/PP/MM/SD模块背景&#xff09; 职责描述 1.PD&Management&#xff1a;负责项目PD和落地实施管理 2.Business&#xff1a;熟悉了解业务需求、判断并合理地将业务需求转化成信息技术需求…

CMake是什么

文章目录 一.什么是CMake二.CMake安装三.CMake一个HelloWord-的语法介绍3.1 PROJECT关键字3.2 SET关键字3.3 MESSAGE关键字3.4 ADD_EXECUTABLE关键字3.5 include_directories关键字3.6 aux_source_directory 四.语法的基本原则4.1 语法注意事项 五.内部构建和外部构建5.1 外部构…

解读传奇补丁什么是Pak文件什么是WIL序列号

Pak文件是GOM引擎自定义图片资源格式&#xff0c;支持密码功能,可以使用工具包中的WIL编辑器创建修改等编辑&#xff0c;很多脚本命令和功能都会使用这个WIL序号&#xff0c;M2-查看-列表信息二这里可以自定义添加&#xff0c;Pak文件读取规则详细查看登录器配置器 Pak文件读取…

【C语言】mmap函数

mmap是一种在Unix/Linux操作系统中将文件映射到进程的地址空间的方法&#xff0c;它允许程序像访问内存一样访问文件。这种方法可以提高文件访问的速度和效率&#xff0c;特别是对于大文件而言。 以下是mmap的基本使用方法&#xff1a; 1. 包含头文件&#xff1a; 在使用mma…

H264帧内预测介绍

4x4 luma宏块的预测模式 4x4 luma宏块有9种预测模式 16x16 luma宏块的预测模式 16 x16 luma宏块有四种预测模式 帧内预测模式信令(Signalling intra prediction modes) 4x4 或者8x8 luma prediction 对4x4或者8x8 luma因为每一个宏块都要指明预测模式,且有9种预测模式可…

YOLOv7保姆级教程(个人踩坑无数)----训练自己的数据集

目录 一、前言&#xff1a; 二、YOLOv7代码下载 三、环境配置 四、测试结果 五、制作自己的数据集 六、训练自己的数据集 一、前言&#xff1a; 上一篇已经详细讲解了如何安装深度学习所需要的环境&#xff0c;这一篇则详细讲解如何配置YOLOv7&#xff0c;在本地电脑或者…

为什么说AI现在还不行!

AI最近有点被妖魔化了&#xff0c;很像一个老虎在还没有橘猫大的时候&#xff0c;就已经被天天当成虎力大仙来讨论。这种普遍的高预期其实是有害的&#xff0c;尤其是当事情本身还需要耐心细致深耕且长跑的时候。资本、品牌可以匹配高预期所对应的增长倍数&#xff0c;业务则不…

ubuntu22.04安装 nvidia-cudnn

nvidia-cudnn 是 NVIDIA CUDA 深度神经网络库&#xff08;CUDA Deep Neural Network library&#xff09;的缩写。这是一个由 NVIDIA 提供的库&#xff0c;用于加速深度学习应用程序。它包含了针对深度神经网络中常用操作&#xff08;如卷积、池化、归一化、激活层等&#xff0…

数据结构--二叉树

目录 1.二叉树链式结构的实现 1.1 前置说明 1.2 二叉树的遍历 1.2.1 前序、中序以及后序遍历 1.2.2 层序遍历及判断是否为完全二叉树 1.3 节点个数&#xff0c;叶子节点个数&#xff0c;第k层节点个数以及高度等 1.4 二叉树的创建和销毁 1.二叉树链式结构的实现 1.1 前置说…

记一次mybatis-plus的argument type mismatch报错

起初以为是boolean和数据库的tinyint不匹配导致&#xff0c;找了一天之后想起来把整个lambda注释掉发现list直接无法运行&#xff0c;说明问题不在boolean List<BmsBillboard> list bmsBillboardService.list(new LambdaQueryWrapper<BmsBillboard>().eq(BmsBillb…

【VRTK】【VR开发】【Unity】13-攀爬

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 VRTK提供两个预制件实现攀爬 Climbing Controller,用于控制Player的物理义体Climbable Interactable,用于设置可攀爬对象【设置Climbing Controller…