面试题:说一下 http 报文都有哪些东西?

2024-06-04 13:04

本文主要是介绍面试题:说一下 http 报文都有哪些东西?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

面试题:说一下 http 报文都有哪些东西?

  • HTTP 是传输超文本(实际上除了 HTML,可以传输任何类型的文件,如视频、音频、文本等)的协议,是一组用于浏览器-服务器之间数据传输规则

  • HTTP 位于 OSI 七层模型的顶层(应用层),应用程序可以在其中交换数据。HTTP 是 TCP/ICP 协议族的一部分。

  • HTTPS 是另一种传输协议,这里的 S 表示安全(Secure)。其与 HTTP 的区别在于,消息在传递前会被加密

  • 浏览器和服务器之间通过 HTTP 报文进行通信。浏览器向服务器发送请求报文,服务器返回给浏览器响应报文。解释如下。

一. 请求报文

报文结构

请求报文(request)分为四部分:请求行(request line)、请求头(request headers)、空行(blank line)、请求体(request body)

  1. 请求行:任何一个 HTTP 请求的第一行都称之为请求行,包含三部分内容:请求方法(method)、请求路径(request url)、HTTP 版本(HTTP version)

    • 请求方法:表示浏览器请求对资源要进行的操作

      方法作用
      GET从服务器请求资源。由于传递的参数直接显示在地址栏中,而浏览器和服务器对 URL 长度有限制,因此 GET 请求不适合传递私密数据和大量数据
      POST向服务器发送数据。将传递的数据封装在 HTTP 报文的请求体中,可以传输大量数据,同时不会显示在地址栏中。
      PUT更新服务器中的资源。与 POST 类似,但是 PUT 请求指定了资源的存放位置,而 POST 则没有。
      DELETE删除服务器中的资源
      HEAD与 GET 相同,但是响应报文不包含响应体。通常用于获取元数据检查资源是否存在(验证 URL)检查资源自上次请求以来是否更改等场景。HEAD 请求因为省去了传输请求体的时间,因此在对应的场景下更加高效。
      OPTIONS浏览器可以使用 OPTIONS 请求来查询服务器在特定资源上允许的 HTTP 方法(如 GET、POST、PUT、DELETE),此时服务端返回的响应报文中包含 Allow 请求头。发送 AJAX 跨域请求访问资源时,浏览器会发送一个 OPTIONS 请求,称之为预检请求,以确保服务器允许该跨域操作,此时服务端返回的响应报文中包含 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Max-Age 请求头。
    • 请求路径:表示要请求的资源的 URL 地址。请求资源的目标地址需要包含:协议、域名或 IP 地址、端口号、请求路径、请求参数(可选)

    • HTTP 版本:当前正在使用的 HTTP 协议版本。常见版本为 HTTP/1.1 和 HTTP/2,默认使用 HTTP/2。

      • HTTP/1.1 使用纯文本格式进行数据传输;而 HTTP/2 使用二进制格式进行数据传输,提高了传输和解析的效率。
      • HTTP/1.1 和 HTTP/2 都是基于 TCP 协议;HTTP/1.1 存在队头阻塞问题,同一条 TCP 连接上,必须按顺序发送请求和处理响应;HTTP/2 消除了队头阻塞问题,允许在单个 TCP 连接上同时发送请求和处理响应,从而实现多路复用,提高了并发性。
      • HTTP/2 使用 HPACK 算法对头部进行压缩,从而减小头部大小,提高传输效率。
      • HTTP/2 支持服务端在客户端请求之前主动推送资源,减少延迟。
      • HTTP/2 支持请求的优先级和流量控制,优化了资源的传输顺序和带宽利用率。
  2. 请求头:请求行一结束紧接着就是请求头,提供本次请求的额外信息。可以通过请求头设置浏览器将接收的响应类型等信息。

    • 请求头**类似键值对(name: value)**的形式。值的取值和结构由请求头决定。

    • 请求头不分大小写

    • 每个请求头占据一行。

    常用请求头作用
    User-Agent发送请求的浏览器类型
    Accept浏览器可识别的响应数据类型列表
    Accept-Language浏览器可接受的自然语言
    Accept-Encoding浏览器可接受的编码压缩格式
    Accept-Charset浏览器可接受的编码字符集
    Host接收请求的主机名
    Connection浏览器和服务器的连接方式(close 或 keepalive)
    Cookie存储于客户端的字段,通常向同一域名的服务端发送属于当前域名的 Cookie
    Content-Type浏览器发送的请求体的数据类型
  3. 空行:请求头后边是一个空行,用于标识请求头部分的结束。

  4. 请求体可选的。一般来说,POST 和 PUT 请求的请求报文中才会包含请求体,其中包含要向服务器发送的数据(如表单输入或文件上传)。

服务器收到请求报文后,对其进行处理,然后向浏览器发送一个响应报文。与请求报文类似,响应报文包含响应行(可以用于标识请求是否成功等)、响应头(设置响应元信息)、空行和响应体(包含请求的资源或提示信息)。

二. 响应报文

报文结构

响应报文(response)也分为四部分:状态行(status line)、响应头(response headers)、空行(blank line)、响应体(response body)

  1. 状态行:任何一个 HTTP 响应的第一行都称之为状态行,包含三部分内容:HTTP 版本(HTTP version)、状态码(status code)、状态描述(status text)

    • HTTP 版本:当前正在使用的 HTTP 协议版本。

    • 状态码:表示请求状态的 3 位数字。其中第一个数字表示响应类别。

      状态码状态描述含义
      1 x x \bf{\Large{1xx}} 1xx信息性状态码表示请求已接收,继续处理。
      100Continue表示客户端应该继续请求或忽略此状态码。
      101Switching Protocols表示服务端正在根据客户端的请求切换协议。
      2 x x \bf{\Large{2xx}} 2xx成功状态码表示请求已接收、理解和处理。
      200OK表示请求成功,服务器已返回所请求的资源。
      201Created表示请求成功,并导致了一个新资源的创建。
      202Accepted表示请求已接收,但是尚未处理完成。
      204No Content表示请求成功,但没有内容返回。该状态码常用于 DELETE 操作。
      3 x x \bf{\Large{3xx}} 3xx重定向状态码表示需要客户端采取进一步操作。
      301Moved Permanently表示请求的资源已永久移动到新的位置,客户端需要使用新 URL 进行访问。
      302Found表示请求的资源临时搬到新的位置,客户端应继续使用原 URL 进行请求。
      303See Other表示请求的资源临时搬到新的位置,客户端应继续使用原 URL + GET 方法进行请求。
      304Not Modified表示资源未修改,可以使用缓存版本。客户端在请求文件时,如果发现存在的缓存文件中有 Last Modified 时间标识,则向浏览器发送请求时在请求头中包含 If-Modified-Since。如果客户端发现自从 Last Modified 对应资源未改变,则返回 304,表示可以使用缓存文件,否则返回 200。
      4 x x \bf{\Large{4xx}} 4xx客户端错误状态码表示客户端出现了错误。
      400Bad Request表示客户端请求存在语法错误
      401Unauthorized表示请求未授权。
      403Forbidden表示服务端拒绝请求。
      404Not Found表示请求的资源不存在。这可能是因为客户端输入了错误的 URL。
      405Methods Not Allowed表示请求方法对资源不适用。这可能是因为使用 GET 请求一个只能 POST 的资源。
      5 x x \bf{\Large{5xx}} 5xx服务器错误状态码表示服务器在处理请求时发生了内部错误。
      500Internal Server Error表示服务器内部错误,无法完成请求。
      501Not Implemented表示服务器不支持请求的方法。
      502Bad Gateway表示网关或代理服务器从上游服务器中接受到无效响应。
      503Service Unavailable表示服务器暂时过载或维护,无法处理请求。
      504Gateway Timeout表示网关或代理服务器未及时从上游服务器中接受到响应。
    • 状态描述:对状态码简短、可读的描述。

  2. 响应头:与请求头类似,提供本次响应的额外信息。

  3. 空行:与请求报文的空行类似,标识响应头的结束。

  4. 响应体:包含浏览器请求的资源(HTML、JSON、图片等)。

REFERENCES

https://medium.com/@adilrk/http-request-and-response-e7da8eb3a00c

https://juejin.cn/post/6931636106710482958

这篇关于面试题:说一下 http 报文都有哪些东西?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1030158

相关文章

找完工作该补充的东西

首先: 锻炼身体,包括乒乓球,羽毛球,都必须练习,学习,锻炼身体等是一个很重要的与人交际沟通的方式; 打牌,娱乐:会玩是一个人很重要的交际沟通的法宝; 摄影:这个是一个兴趣爱好,也是提高自己的审美,生活品质,当然也是与人沟通的重要途径; 做饭:这个的话就是对自己,对朋友非常有益的一件事情;

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

【SparkStreaming】面试题

Spark Streaming 是 Apache Spark 提供的一个扩展模块,用于处理实时数据流。它使得可以使用 Spark 强大的批处理能力来处理连续的实时数据流。Spark Streaming 提供了高级别的抽象,如 DStream(Discretized Stream),它代表了连续的数据流,并且可以通过应用在其上的高阶操作来进行处理,类似于对静态数据集的操作(如 map、reduce、

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

el-upload 上传图片及回显照片和预览图片,文件流和http线上链接格式操作

<div v-for="(info, index) in zsjzqwhxqList.helicopterTourInfoList" :key="info.id" >编辑上传图片// oss返回线上地址http链接格式:<el-form-itemlabel="巡视结果照片":label-width="formLabelWidth"><el-upload:action="'http:

Java线程面试题(50)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程,

MQTT之CONNECT控制报文详解

目录 1.  MQTT协议规范 2.  名词解释 3.  CONNECT控制报文详解 3.1  固定报头 Fixed header 3.2  可变报头 Variable header 3.2.1  协议名 Protocol Name 3.2.2  协议级别 Protocol Level 3.2.3  连接标志 Connect Flags 3.2.4  保持连接 Keep

HTTP状态码中301与302的区别

一.官方说法  301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:  301 redirect: 301 代表永久性转移(Permanently Moved)。  302 redirect: 302 代表暂时性转移(Temporarily Moved )。  这是很官方的说法,那么它们的区别到底是什么呢?  1.1、什么是301转向?什么是301重定向?

C语言常见面试题3 之 基础知识

(1)i++和++i哪个效率更高? 对于内建数据类型,二者效率差别不大(去除编译器优化的影响) 对于自定义数据类型(主要是类),因为前缀式(++i)可以返回对象的引用;而后缀式(i++)必须返回对象的值,所以导致在大对象时产生了较大的复制开销,引起效率降低。 (2)不使用任何中间变量如何交换a b的值? void swap(int& a, int& b)//采用引用传参的方式{a^=

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文件到Runtim