前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
HTTP协议
HTTP协议属于建立在TCP协议
中的应用层上的一种协议,HTTP协议以客户端请求和服务端应答为标准
浏览器通常被人称为客户端,Web服务器常被称作服务端
HTTP协议常用端口为80,客户端首先通过80端口向HTTP服务端发起请求,建立TCP连接;之后进行HTTP数据传输
协议 | 层 |
HTTP | 应用层 |
SSL/TLS | 加密层 |
TCP | 传输层 |
IP | 传输层 |
数据链路层 | 物理层 |
当浏览器作为客户端访问服务器之后,取到所有所需的数据,立即断开TCP连接,整个HTTP连接过程非常短,所以人们也常称HTTP协议为无连接的协议
这也因为每一次HTTP的请求,都是重新开启一个新的连接,而不是在一个历史连接持续工作
资源定位标识符
发起HTTP请求的内容资源由统一资源标识符(Uniform Resource Identifiers)URI进行表示
其中资源定位标识符主要有三种
- URI:统一资源标识符(uniform resource identifier);唯一表示一个资源。
- URN:统一资源命名(uniform resource name);通过名字来表示资源。
- URL:统一资源定位器(uniform resource locaotor);一个具体的URI标示,可以通过该标识获取访问到对应资源
URI
其中如果已经是一个URL,那么肯定是一个URI标识;但是一个URI并不一定是一个URL;URL是URI的一种表现形式
URL
URL是资源标识符,而URL不光具有标识性,还需要具有定位性,用来更加具体描述资源的具体位置,并且还会指明获取资源所采用的协议。一个URL包含,主机名称(IP或域名)、端口号(默认为80)、路径和查询字符串5部分
http://www.example.com:80/aaa/test.jpg?id=1
- 网络协议为:http
- 主机:www.example.com
- 端口:80
- 路径:aaa/test.jpg
- 查询字符串参数:id=1
URN
URN也是URI的一种表现形式,包括名字(给定的命名空间),但是不包括访问的方式
www.example.com/aaa/test.jpg
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ba9mRGrq-1634811378238)(./静态资源/URI图示.png)]
Request
当我们使用HTTP协议访问某个连接时,首先需要向服务器提交一个Request请求;
一般当我们使用浏览器访问Web服务时,由浏览器完成这个工作,Request消息分为三部分,分别包括:Request Line、Request Header、Body
下面为HTTP协议在Request时的消息体构造:
请求方法 | 空 | URL | 空 | 协议版本 | \r | \n | Request Line |
头部字段 | **😗*冒号 | 对应字段 | \r | \n | Request Header | ||
头部字段 | **😗*冒号 | 对应字段 | \r | \n | Request Header | ||
其他头部字段属性… | Request Header | ||||||
\r | \n | 在头部信息之后必须要有该换行回车符号 | |||||
其他数据 | Body |
- 一个通过curl命令获取到的访问Web服务时的信息
curl -v https://baidu.com
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: baidu.com
> Accept: */*
>
请求方式
请求 | 解释 |
GET | 获取服务端数据; |
POST | 向服务端提交数据; |
PUT | 向服务端上传数据; |
DELETE | 删除服务端通过Request-URL所标示的资源; |
TRACE | 测试服务端是否可以接收到Request请求; |
CONNECT | 以管道方式连接代理服务器; |
OPTIONS | 返回服务器所支持的其他HTTP请求方法; |
HEAD | 与GET方法类似,但不返回服务器响应时的消息体; |
Response响应
服务器接收到之后,会向我们返回一个Response响应,浏览器接收到了Response之后,会帮助我们对信息进行解析,之后我们就可以看到对应的Web页面及获取到的资源
下面是HTTP协议在Response响应时的消息体构造
响应版本 | 空 | 状态码 | 空 | 状态信息 | \r | \n | Response Line |
头部字段 | **😗*冒号 | 对应字段 | \r | \n | Response Header | ||
头部字段 | **😗*冒号 | 对应字段 | \r | \n | Response Header | ||
他头部字段属性… | |||||||
\r | \n | 在头部信息之后必须要有该换行回车符号 | |||||
响应数据 | Body |
- 可以使用curl -v命令查看到Response信息
< HTTP/1.1 302 Moved Temporarily
< Server: bfe/1.0.8.18
< Date: Thu, 30 Apr 2020 01:33:50 GMT
< Content-Type: text/html
< Content-Length: 161
< Connection: keep-alive
< Location: http://www.baidu.com/
<
<html>
<head><title>302 Found</title></head>
<body bgcolor="white">
<center><h1>302 Found</h1></center>
<hr><center>bfe/1.0.8.18</center>
</body>
</html>
状态码
状态码 | 状态码英文标示 | 意义 |
100 | Continue | HTTP/1.1中新增状态码,表示客户端可以继续请求HTTP服务器; |
101 | Switching Protocols | 服务端切换请求协议,切换到HTTP协议新版本; |
200 | OK | 客户端的请求服务端正常完成; |
301 | Moved Permanently | 客户端请求的资源已被永久移动到新的URL; |
302 | Found | 客户顿请求的资源被临时移动,客户端继续使用原有URL;常用于三方登录之后的跳转; |
304 | Not Modified | 请求的资源未被修改,可以继续访问原URL 常用于缓存; |
400 | Bad Request | 客户端的请求语法错误,或无法解析请求; |
401 | Unauthorized | 请求需要经过身份验证; |
402 | Payment Required | 保留状态码,为以后使用做准备的呢; |
403 | Forbidden | 服务端直接拒绝客户端的请求; |
404 | Not Found | 客户端请求的资源找不到; |
405 | Method Not Allowed | 客户端请求的方式不被允许; |
406 | Not Acceptable | 客户端请求的内容无法正常完成; |
499 | Client has closed Connection | 服务端处理该请求花费了太长的时间; |
500 | Internal Server Error | 服务端内部错误; 可能是因为Web服务配置文件读取错误 也可能是因为用户权限等等问题导致… |
502 | Bad Geteway | 服务端内部错误; 服务端错误的网关; |
503 | Service Unavailable | 服务端无法响应客户端的请求; |
504 | Gateway Time-out | 服务端处理请求超时;或者可能是访问的网管超时; |
505 | HTTP Version not Supported | 客户端请求的HTTP协议版本无法被服务端支持; 可能是你的浏览器太古老了; |
请求报文字段
我们看到的请求头,就是当我们通过浏览器访问一个URL时,会向服务器发送的,我们经常叫这个为Request Headers(请求头);在请求头中,维护了很多字段信息,这些常见的HTTP请求头中响应字段的详细解释如下
参考地址:https://en.wikipedia.org/wiki/List_of_HTTP_header_fields
Accept: text/html | 指定客户端支持接收的数据类型(MIME类型)。 |
Accept-Charset: utf-8 | 指定客户端可接受的字符集,缺省表示任何字符集都可以接受; |
Accept-Encoding: gzip, deflate | 指定客户端支持的Web服务器返回内容压缩编码类型。 |
Accept-Language: zh-CN | 指定客户端可以接受的语言; |
Authorization:Basic xxx= | HTTP认证的权限; |
Cache-Control: no-cache | 指定所有缓存机制必须遵从的指令; |
Connection: keep-alive | 表示是否需要持久连接(HTTP1.1协议中默认进行持久连接); |
Content-Length: 123 | 请求的内容长度; |
Content-Type: text/html | 用于在post及put时请求的媒体类型; |
Cookie: $XXX | 保存在该请求域名下的COOKIE值信息,常用于表示用户的历史访问记录; |
Date: Tue, 15 Nov | 请求发送的日期时间; |
Referer: … | 访问到这个站点之前的地址,用来指定访问从何处而来; |
User-Agent: … | 指定当前访问者的用户信息,经常为一些浏览器、操作系统属性; |
响应报文字段
Age: 775 | 从原始服务器到代理缓存形成的时间估算(秒为单位); |
Allow: GET,HEAD | 指定资源的有效请求行为,不允许请求则返回405; |
Cache-Control: max-age=3600 | 缓存机制,max-age参数未缓存有效时间(秒为单位); |
Content-Encoding: gzip | 响应内容的支持的压缩编码类型 |
Content-Disposition: attachment; filename=“fname.ext” | 可下载资源属性(MIME二进制格式),提供文件下载的对话框,并默认文件名为filename; |
Content-Length: 348 | 响应的数据长度; |
Content-Language: en-US | 响应的数据语言格式; |
Content-Location: /index.htm | 响应资源的替代地址; |
Content-Type: text/html; charset=utf-8 | 响应数据的MIME类型; |
Date: Tue, 15 Nov… | 服务器发送响应时的日期时间; |
Expires: Tue, 15 Nov… | 响应过期的日期时间; |
Server: Nginx | Web服务器名称; |
Set-Cookie: username=test; Max-Age=3600; | 设置HTTP响应中的cookie值; |
MIME类型
经常我们的服务端会返回很多类型的内容给到客户端,这就需要在返回的过程中在Response中指明返回的文件类型,然后浏览器等各种客户端工具可以通过解析在Response中涉及MIME类型对应文件使用已有应用程序来解释各种文件类型。
其中MIME支持属性有如下:
- application/msexcel:微软Execl文件;.xls .xla;
- application/mshelp:微软windows帮助文件;.hlp .chm
- application/mspowerpoint:微软PowerPoint文件;.ppt .ppz .pps .pot
- application/msword:微软Word文件;.doc .dot;
- application/octet-stream:二进制可执行文件;.exe;
- application/pdf:Adobe PDF文件;.pdf;
- application/post******:Adobe post***文件;.ai .eps .ps;
- application/rtf:微软rtf文件;.rtf;
- application/x-httpd-php:PHP文件;.php .phtml;
- application/x-java******:服务端的java***文件;.js;
- application/x-shockwave-flash:Shockwave-Flash文件;.swf .cab;
- application/zip:ZIP存档文件;.zip;
- audio/basic:音频文件;.au .snd;
- audio/mpeg:MPEG文件;.mp3;
- audio/x-midi:MIDI文件;.mid .midi;
- audio/x-mpeg:MPEG文件;.mp2;
- audio/x-wav:Wav文件;.wav;
- image/gif:Gif文件;.gif;
- image/jpeg:JPEG文件;.jpeg .jpg .jpe;
- image/x-windowdump:X-Windows存储文件;.xwd;
- text/css:css样式表文件;.css;
- text/html:html类型;.html .htm .shtml;
- text/java******:Java***文件;.js;
- text/plain:文本类型;.txt;
- video/mpeg:MPEG文件;.mpeg .mpg .mpe;
- video/vnd.rn-realvideo:在线播放视频文件;.rmvb;
- video/quicktime:Quicktime文件,苹果公司提供的视频文件格式;.qt .mov;
- video/vnd.vivo:Vivo文件;.viv .vivo;