【Java核心面试宝典】Day18、GET和POST请求都有哪些常见面试题?

举报
灰小猿 发表于 2021/08/31 15:28:51 2021/08/31
【摘要】 ​ Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!用坚持缔造技术、用指尖敲动未来!和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣!在此专栏《Java核心面试宝典》记录我们备战梦想的【day 18】!​今天来和小伙伴们分享一下关于HTTP中常见的几种方法以及他们可能被出到的...

 

Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!
用坚持缔造技术、用指尖敲动未来!
和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣
在此专栏《Java核心面试宝典》记录我们备战梦想的【day 18】

今天来和小伙伴们分享一下关于HTTP中常见的几种方法以及他们可能被出到的面试题。

一、HTTP头部主要包含哪些信息?

HTTP头部本质上作为一个传递额外重要信息的键值对,主要分为:通用头部、请求头部、响应头部和实体头部。

下面是这四种头部信息中主要包括的内容:

通用头部包括有:

协议头

说明

举例

Cache-Control

用来指定当前的请求/回复中是否使用缓存机制

Cache-Control: no-store

Connection

客户端(浏览器)想要优先使用的连接类型

Connection: keep-alive (Upgrade)

Date

报文创建时间

Date: Dec, 26 Dec 2015 17: 30: 00 GMT

Trailer

会实现说明在报文主体后记录哪些首部字段,该首部字段可以使用在 HTTP/1.1 版本分块传输编码时

Trailer: Expiress

Transfer-Encoding

用来改变报文格式

Transfer-Encoding: chunked

Upgrade

要求服务器升级到一个高版本协议

Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

Via

告诉服务器,这个请求是由哪些代理发出的

Via: 1.0 fred, 1.1 itbilu.com.com (Apache/1.1)

Warning

一个一般性的警告,表示在实体内容中可能存在错误

Warning: 199 Miscellaneous warning

请求头部包括有:

协议头

说明

举例

Accept

告诉服务器自己允许哪些媒体类型

Accept: text/plain

Accept-Charset

浏览器申明可接受的字符集

Accept-Charset: utf-8

Accept-Encoding

浏览器申明自己接收的编码方法

Accept-Encoding: gzip, deflate

Accept-Language

浏览器可接受的响应内容语言列表

Accept-Language: en-US

Authorization

用于表示 HTTP 协议中需要认证资源的认证信息

Authorization: Basic OSdjJGRpbjpvcGVul ANIc2SdDE==

Expect

表示客户端要求服务器做出特定的行为

Expect: 100-continue

From

发起此请求的用户的邮件地址

From: user@itbilu.com

Host

表示服务器的域名以及服务器所监听的端口号

Host: www.itbilu.com:80

If-XXX

条件请求

If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT

Max-Forwards

限制该消息可被代理及网关转发的次数

Max-Forwards: 10

Range

表示请求某个实体的一部分,字节偏移以 0 开始

Range: bytes=500-999

Referer

表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面

Referer: http://itbilu.com/nodejs

User-Agent

浏览器的身份标识字符串

User-Agent: Mozilla/……

响应头部包括有:

协议头

说明

举例

Accept-Ranges

字段的值表示可用于定义范围的单位

Accept-Ranges: bytes

Age

创建响应的时间

Age:5744337

ETag

唯一标识分配的资源

Etag:W/"585cd998-7c0f"

Location

表示重定向后的 URL

Location: http://www.zcmhi.com/archives/94.html

Retry-After

告知客户端多久后再发送请求

Retry-After: 120

Server

告知客户端服务器信息

Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)

Vary

缓存控制

Vary: Origin

实体头部包括有:

协议头

说明

举例

Allow

对某网络资源的有效的请求行为,不允许则返回405

Allow: GET, HEAD

Content-encoding

返回内容的编码方式

Content-Encoding: gzip

Content-Length

返回内容的字节长度

Content-Length: 348

Content-Language

响应体的语言

Content-Language: en,zh

Content-Location

请求资源可替代的备用的另一地址

Content-Location: /index.htm

Content-MD5

返回资源的MD5校验值

Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==

Content-Range

在整个返回体中本部分的字节位置

Content-Range: bytes 21010-47021/47022

Content-Type

返回内容的MIME类型

Content-Type: text/html; charset=utf-8

Expires

响应过期的日期和时间

Expires: Thu, 01 Dec 2010 16:00:00 GMT

Last-Modified

请求资源的最后修改时间

Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT

二、如何知道HTTP的报文长度?

当相应消息中存在content-length的时候,我们可以直接根据这个值来判断数据是否接收完成,例如客户端向服务器请求一个静态页面或者一张图片的时候,服务器能够很清楚的知道请求内容的大小,因此可以通过消息首部字段content-length来告诉客户端需要接收多少的数据。但是如果服务器预先不知道请求内容的大小,例如加载动态页面的时候,就需要使用Transfer-Encoding: chunked 的方式来代替 Content-Length。

分块传输编码(Chunked transfer encoding)是 HTTP/1.1 中引入的一种数据传输机制,其允许 HTTP 由服务器发送给客户端的数据可以分成多个部分,当数据分解成一系列数据块发送时,服务器就可以发送数据而不需要预先知道发送内容的总大小,每一个分块包含十六进制的长度值和数据,最后一个分块长度值为0,表示实体结束,客户机可以以此为标志确认数据已经接收完毕。

三、HTTP方法了解哪些?

HTTP/1.0定义了三种请求方法:GET、POST和HEAD方法

HTTP/1.1增加了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE和CONNECT方法

所以现在一共有九种HTTP方法,他们的作用分别如下:

方法

描述

GET

请求指定的页面信息,并返回具体内容,通常只用于读取数据。

HEAD

类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。

POST

向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立或已有资源的更改。

PUT

替换指定的资源,没有的话就新增。

DELETE

请求服务器删除 URL 标识的资源数据。

CONNECT

将服务器作为代理,让服务器代替用户进行访问。

OPTIONS

向服务器发送该方法,会返回对指定资源所支持的 HTTP 请求方法。

TRACE

回显服务器收到的请求数据,即服务器返回自己收到的数据,主要用于测试和诊断。

PATCH

是对 PUT 方法的补充,用来对已知资源进行局部更新。

四、GET请求和POST请求的区别?

  • Get提交的数据会被放置在URL之后,并且请求参数会被完整的保留在浏览器的记录里,由于参数直接暴露在URL中,可能存在安全问题,因此往往用于获取资源信息。而post参数放置在请求主体中,并且参数不会被保留。因此相比于get方法,post方法更安全,主要用于修改服务器上的资源。
  • Get请求只支持URL编码,post请求支持多种编码格式。
  • Get请求只支持ASCII字符格式的参数,而post请求没有限制。
  • Get请求提交的数据大小有限制(这里所说的限制是针对浏览器而言的)。而post提交的数据没有限制。
  • Get方式需要使用Request QueryString来获取变量的值,而post方式通过Request Form来获取
  • Get方法产生一个tcp数据包,post方法产生两个(并不是所有的浏览器中都产生两个)
  • 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务端响应200,请求成功。
  • 对于POST方式的请求,浏览器会先发送http header给服务端,告诉服务端等一下会有数据过来,服务端响应100 continue,告诉浏览器我已经准备接收数据,浏览器再post发送一个data给服务端,服务端响应200,请求成功。

五、追问:既然GET请求提交的数据大小有限制,那么他的长度限制是多少?

HTTP 中的 GET 方法是通过 URL 传递数据的,而 URL 本身并没有对数据的长度进行限制,真正限制 GET 长度的是浏览器,

例如 IE 浏览器对 URL 的最大限制为 2000多个字符,大概 2KB左右,像 Chrome, FireFox 等浏览器能支持的 URL 字符数更多,其中 FireFox 中 URL 最大长度限制为 65536 个字符,Chrome 浏览器中 URL 最大长度限制为 8182 个字符。

并且这个长度不是只针对数据部分,而是针对整个 URL 而言,在这之中,不同的服务器同样影响 URL 的最大长度限制。因此对于特定的浏览器,GET的长度限制不同。

由于 POST 方法请求参数在请求主体中,理论上讲,post 方法是没有大小限制的,而真正起限制作用的是服务器处理程序的处理能力。

今日总结

今天最主要其实是HTTP协议中的多种方法的使用和理解,我们需要掌握get和post请求的原理、他们的区别、各自的请求方式、适用于什么场景等等。

如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,我会把大家提出的总结到文章内, 欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!

我是 灰小猿 ,我们下期见!


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。