详解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.mfbz.cn/a/226882.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

添加新公司代码的配置步骤-Part2

原文地址&#xff1a;配置公司代码 概述 在第一部分中&#xff0c;我讨论并列出了在 SAP 中构建新公司代码时企业结构部分所需的任务。在这篇博客中&#xff0c;我将列出并讨论 FI 模块中需要配置的内容。您还记得本主题涵盖六个部分。 企业结构 - 第 1 部分 FI 配置– 第 2…

2023新优化应用:RIME-CNN-LSTM-Attention超前24步多变量回归预测算法

程序平台&#xff1a;适用于MATLAB 2023版及以上版本。 霜冰优化算法是2023年发表于SCI、中科院二区Top期刊《Neurocomputing》上的新优化算法&#xff0c;现如今还未有RIME优化算法应用文献哦。RIME主要对霜冰的形成过程进行模拟&#xff0c;将其巧妙地应用于算法搜索领域。 …

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

[BJDCTF2020]EzPHP 许多的特性

这道题可以学到很多东西 静下心来慢慢通过本地知道是干嘛用的就可以学会了 BJDctf2020 Ezphp_[bjdctf2020]ezphp-CSDN博客 这里开始 一部分一部分看 $_SERVER[QUERY_SRING]的漏洞 if($_SERVER) { if (preg_match(/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|…

C++新经典模板与泛型编程:用成员函数重载实现is_base_of

用成员函数重载实现is_base_of std::is_base_of是一个C 11标准中用于判断某个类是否是另一个类父类的类模板。 #include "killCmake.h"#include<string>using namespace std;class A { };class B : public A { public:B(int x): x_(x){} private:int x_; };/…

低代码——“平衡饮食”才是王道

文章目录 一、低代码的概念二、低代码的优点2.1. 高效率与快速开发2.2. 降低技术门槛2.3. 适用于快速迭代与原型开发 三、低代码的缺点3.1. 定制性不足3.2. 深度不足3.3. 可能导致技术债务 四、低代码开发的未来4.1. 深度定制化4.2. 智能化 五、低代码会替代传统编程吗&#xf…

力扣每日一题day30[226. 翻转二叉树]

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#…

Abaqus基础教程--胶合失效仿真

胶合是电子行业中常见的连接方式&#xff0c;abaqus中常用cohesive单元或者cohesive接触两种方法进行胶合失效仿真&#xff0c;这两种方式操作方法有所差别&#xff0c;但结果一般大同小异。 本例模型比较简单&#xff0c;建模过程从略&#xff0c;使用静态分析&#xff0c;使…

月薪6W!美团、网易等大厂急招HarmonyOS开发!

近期&#xff0c;多家互联网公司发布了多个和鸿蒙系统有关的岗位。 不仅如此&#xff0c;还与Windows等主流老牌操作系统并列&#xff0c;并且排在首位介绍。 此外&#xff0c;今日头条招聘Android开发工程师也提及岗位需要“负责今日头条 Android、鸿蒙系统等新技术方向调研…

代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和,474.一和零

1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&am…

前端Flex布局的常用属性及其应用场景

目录 学习目标&#xff1a; 学习内容&#xff1a; 什么是flex布局&#xff1f; 如何使用flex布局&#xff1f; 容器属性 项目属性 flex布局有哪些主要的属性&#xff1f; flex布局的优缺点是什么&#xff1f; 学习时间&#xff1a; 最后总结&#xff1a; 学习目标&am…

医院信息系统源码,采用JAVA编程,支持跨平台部署应用,满足一级综合医院(专科二级及以下医院500床)的日常业务应用

医院HIS系统源码&#xff0c;HIS系统全套源码&#xff0c;支持电子病历4级&#xff0c;自主版权 his医院信息系统内设门诊/住院医生工作站、门诊/住院护士工作站。各工作站主要功能依据职能要求进行研发。如医生工作站主要功能为编辑电子病历、打印、处理医嘱&#xff1b;护士工…

虾皮关键词工具:优化您的Shopee商品曝光度和搜索排名

在Shopee平台上&#xff0c;关键词工具对于提高商品曝光度和搜索排名非常重要。本文将向您介绍一些值得推荐的关键词工具&#xff0c;这些工具可以帮助您找到合适的关键词以优化您的商品列表&#xff0c;并提高搜索排名和曝光度。 先给大家推荐一款shopee知虾数据运营工具知虾免…

读者和写者问题

它可以解决的问题&#xff1a; 可以支持多个读者访问&#xff0c;通过count计数 来实现多个读者访问的时候是互斥的&#xff0c;不会出现不符合进程同步的问题&#xff1a;设置mutex互斥锁&#xff0c;保证count或count--和if Pv(mutex)是一气呵成的 读写公平&#xff0c;通过…

软件工程之UML建模

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、建模基础 1.建模的底层逻辑 用一个公式表达建模的底层逻辑&#xff1a;建模 图形 逻辑 现实的抽象&#xff0c;用一句概括即是用图形逻辑…

一张图理解接口测试框架

测试框架先向测试数据库中插入测试数据&#xff08;如&#xff1a;name”Tom“&#xff09; 调用被测系统提供的接口&#xff08;传参&#xff1a;name”Tom“&#xff09; 从测试数据库中查到符合参数的数据 将查询到的数据组成Json格式&#xff0c;并返回给测试框架 提供…

添加新公司代码的配置步骤-Part4

原文地址&#xff1a;配置公司代码 概述 这是一系列讨论和列出向系统添加新公司代码时必须完成的事务的四篇博客中的最​​后一篇。以下是这四个文档涵盖的主题列表&#xff1a; 企业结构 - 第 1 部分 FI 配置 – 第 2 部分 SD 配置 – 第 3 部分 物流 – 概述 – 第 3 部分…

SpringBoot集成系列--ElasticJob

文章目录 一、集成步骤1、添加 ElasticJob 的依赖2、配置 ElasticJob3、定义Job 二、ElasticJob-UI三、Elastic-Job分片理解四、原理 一、集成步骤 1、添加 ElasticJob 的依赖 引入相关依赖到pom.xml <!-- Elastic-Job --> <dependency><groupId>org.apac…

随笔-这都是命吗

我与鹏哥、小付有个小群&#xff0c;前几天&#xff0c;鹏哥在群里发了一个图&#xff0c;是他那个城市准备扶持的高新产业&#xff0c;有元宇宙、量子信息、生物制药、人工智能什么的。 先前的时候鹏哥给我说过&#xff0c;当地准备了六百多亩地&#xff0c;准备发展高新产业…

模块化机房在大数据时代的角色:高效、可扩展的数据存储和处理平台

随着大数据时代的到来&#xff0c;数据已经成为企业竞争的核心资源。然而&#xff0c;传统的数据中心已经无法满足现代业务的需求&#xff0c;尤其是在数据存储和处理方面。模块化机房作为一种新型的数据中心建设模式&#xff0c;具有高效、可扩展等优势&#xff0c;逐渐成为大…
最新文章