【Java核心面试宝典】Day18、GET和POST请求都有哪些常见面试题?
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请求的原理、他们的区别、各自的请求方式、适用于什么场景等等。
如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,我会把大家提出的总结到文章内, 欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!
我是 灰小猿 ,我们下期见!
- 点赞
- 收藏
- 关注作者
评论(0)