HTTP 和 TCP协议
客户端 - 服务端 客服端访问一个路径,路径去DNS域上找对应ip地址 http主要针对应用层:会生成报文,传输内容通过TCP传输,http是基于TCP的,并且能 tcp主要职责:为方便通信,将http请求报文分割成报文段,按序号分为多个报文段,并把每个报文段可靠(UDP是不可靠的)的传给对方
http特点-长连接 keep-alive 发一个请求过去不是立马断开的 客户端同时可以发送N个请求到服务器,服务器等待响应完后再响应给客户端
URI URL URN
uri 统一资源标识符 资源独一的标识信息 url 统一资源定位符 表示资源的地点 urn 统一资源命名符 准确知道名字
URL格式
https://user:pass@ www.example.jp: 80 /dir/index.html? uid=1 #ch1
协议 登录信息 服务器地址 服务器端口号 文件路径 查询字符串 片段标识符(服务器拿不到哈希值)
https://3028213607@qq.com:zf1234567@gitee.com/jw-speed/201805.git
// url.parse('path') 取问号后的参数
let url = require('url');
let {pathname,query} = url.parse('http://user:password@www.zf.cn:80/1.html?a=1&b=c#aaa');
console.log(pathname,query)///1.html,a=1&b=c
/*
Url {
protocol: 'http:',
slashes: true,
auth: 'user:password',
host: 'www.zf.cn:80',
port: '80',
hostname: 'www.zf.cn',
hash: '#aaa',
search: '?a=1',
query: 'a=1',
pathname: '/1.html',
path: '/1.html?a=1',
href: 'http://user:password@www.zf.cn:80/1.html?a=1#aaa' }
*/
//取a=1&b=c
let str = 'a=1&b=c';
let obj = {};
str.replace(/([^=&]*)=([^=&]*)/g,function (data) {
obj[arguments[1]]=arguments[2]
console.log(obj) //{ a: '1', b: 'c' }
})
// url.parse('path',true) 第二个参数会自动把问号后面参数变成对象
let url = require('url');
let {pathname,query} = url.parse('http://user:password@www.zf.cn:80/1.html?a=1&b=c#aaa',true);
//pathname 代表/ 后面的和 ? 前面的 query 是查询字符串
console.log(pathname,query) // /1.html { a: '1', b: 'c' }
HTTP
- 请求的一方叫客户端,响应的一方叫服务器端
- 通过请求和响应达成通信
- HTTP是一种不保存状态的协议
请求报文 - 是一种规范
请求行:
POST /form/entry HTTP/1.1
请求首(头)部字段:
Host: hackr.jp
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
Content-Length:16
请求行
方法
- GET 获取资源
- POST 向服务器端发送数据,传输实体主体
- PUT 传输文件
- HEAD 获取报文首部
- DELETE 删除文件
- OPTIONS 询问支持的方法 : 一般在跨域时发送post时使用,试探形
- TRACE 追踪路径
- 协议/版本号
- URL
内容实体: name=ueno&age=37
- 响应行
- 响应头
- 响应体
报文首部 状态行 空行(CR+LF) 响应首部字段 报文主体 通用首部字段 实体首部字段 其它
> General:
Request URL: https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/wche=0&rsv_tpfail=1&rsv_pstg=20&rsv_prw&rsv_svoice=0&rsv_pre=1&.gif..
Request Method: GET
Status Code: 200 OK
Remote Address: 220.181.112.244:443
Referrer Policy: unsafe-url
> Response Headers :响应头
Accept-Ranges: bytes
Age: 21234872
Cache-Control: max-age=315360000
Content-Encoding: gzip
Content-Length: 5685
Content-Type: application/javascript
Date: Tue, 07 Aug 2018 06:20:59 GMT
ETag: "3812-5437207ef2880"
Expires: Thu, 02 Dec 2027 11:46:27 GMT
Last-Modified: Mon, 12 Dec 2016 08:38:42 GMT
Ohc-Response-Time: 1 0 0 0 0 0
Server: bfe/1.0.8.13-sslpool-patch
Vary: Accept-Encoding,User-Agent
> Request Headers :请求头
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie:
Host: sp0.baidu.com
Referer:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36
状态码类别
类别 原因短语
1XX Informational(信息性状态码)
2XX Success(成功状态码)
2XX 成功 #
200-OK 客户端发过来的数据被正常处理
204-正常响应,没有实体
206-范围请求,返回部分数据,响应报文中由Content-Range指定实体内容
3XX Redirection(重定向)
301-永久重定向
302-临时重定向,规范要求方法名不变,但是都会改变
303-和302类似,但必须用GET方法
304-状态未改变 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307-临时重定向,不该改变请求方法
4XX Client Error(客户端错误状态码)
400-请求报文语法错误
401-需要认证
403-服务器拒绝访问对应的资源
404-服务器上无法找到资源
5XX Server Error(服务器错误状态吗)
500-服务器故障
503-服务器处于超负载或正在停机维护
http 面试题
1) URI URL URN区别
- uri 统一资源标识符 资源独一的标识信息
- url 统一资源定位符 表示资源的地点
- urn 统一资源命名符 准确知道名字
2) restful 风格 规定了不同方法对资源操作是不同的
如对/user进行操作
- get / user 获取用户
- post / user 增加用户
- put / user 修改用户
- delete / user 删除用户