目录
一.URL及协议
- url中的请求数据:请求路径?key1=value&key2=value2
1).网络数据传输,都需要使用同样的协议,双方约定好的统一规范(封装和解析数据格式规范)
协议:数据格式的约定
目标:学习http协议里面的格式,结合理论实操,进行程序调试
http协议格式本身+http数据(数据中包含自己的数据格式)
2).再次回顾URL
- 域名:基于DNS解析为IP
- IP:网络中定位主机的地址(逻辑地址)
- PORT:端口号,定位某个主机中唯一的进程(应用程序)
- http请求的访问路径:
服务路径定位资源
url是全路径(绝对路径)
uri包含了url这种全路径,还包含相对路径,应用上下文是uri,服务路径是uri,两者加在一起也是uri,都是相对路径
特殊的注意事项:输入域名进行访问,其实是访问/这个路径的资源,/也有资源?
浏览器中,不输入端口号,是因为http协议的默认端口是80
二.urlencode和urldecode
像 / ? : 中文等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。
比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。
转义的规则如下:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
"+" 被转义成了 "%2B"
urldecode就是urlencode的逆过程
注:有时候显示的是中文,但是实际上都是%XY的形式进行传输的
- 所以,项目路径尽量避免中文
三.HTTP协议格式
HTTP请求
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度;
HTTP响应
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
常见的Http工具
- 抓包工具:fiddler,charles,浏览器自带的开发者工具
- http请求模拟工具:postman
四.HTTP的请求方法(get和post)
Q:Get和Post的区别?
- 1.请求形式
get的请求数据只能放在url中,post的数据可以放在url和请求体中
- 2.传输数据的大小
get方法传输的数据量会受到限制,虽然在HTTP协议中没有硬性限制,但是特定的服务器和浏览器对url的长度有限制,而get是通过url传输数据的,所以会因此受到限制,一般传输数据量不超过2KB
post方法理论上没有限制,实际上post能传输的数据量取决于服务器的设置和内存大小
总的来说,get的传输数据量会受到限制,post的数据量则可以很大
-
3.传输数据的类型
get方法只允许传输ascii码字符(就是想要传中文要转码),post方法则无限制,也允许二进制数据
- 4.安全性
get传输的参数安全性低,因为数据会显示在url中,所有人可见,而且会被缓存和保留在浏览器历史中;post的数据则不会显示在url中,并且参数不会被缓存和保存在浏览器历史或者web服务日志中。
什么时候用get,什么时候用post呢?
1.有安全性要求的话,用post
2.如果有中文,用post好一点,用get由于只能传输ascii码,还要进行编码和解码的操作
五.HTTP的状态码
- 这些状态码是服务端返回给用户端状态码,是服务端自己设置的,这些状态码的含义都是站在服务端的角色上看的,在用户端的角色上就不一定。比如200在服务端是正确的,但是客户端受到的数据不一定是他们想要的正确的数据
- 400错误包括http协议格式,请求数据的格式,数据类型等错误
- 服务端通过uri和(资源/服务)建立映射关系(大小写敏感),根据uri去找,找不到
- uri已经映射到了,但是服务端提供的请求方法(如get,post方法),不包含客户端的请求的方法(如来了一个poooo方法)
- 一般是服务端抛异常的时候
六.HTTP的头信息(Header)
- Content-Type: 数据类型(text/html等)——(消息体body的格式,告诉对方该用什么方式解析)
- Content-Length: Body的长度——(消息体的长度)
- Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
- User-Agent: 声明用户的浏览器版本信息——(一般在请求体中,告诉服务端我客户端用的什么浏览器)
- referer: 当前页面是从哪个页面跳转过来的;(在请求体中,告诉服务器当前页面是从哪里跳转过来的)
- location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
- Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;