HTTP协议是应用层的一个重要协议。
1.应答模式
应答模式分为许多种,由一问一答、一问多答、多问一答、多问多答。
HTTP属于一问一答,典型的场景有浏览器打开网页、手机app加载数据;
一问多答典型场景有下载大文件;
多问一答典型场景有上传大文件;
多问多答典型场景有桌面远程控制软件。
2.报文格式(HTTP版本1.1)
查看HTTP的报文格式,可以使用Fiddler抓包工具进行查看。
HTTP的报文格式有两种,分为请求报文和响应报文;
请求报文包括首行、请求头、空行、正文(可能没有);
响应报文包括首行、响应头、空行、正文;
下面是用Fiddler抓包搜狗网站查看报文的结果,
请求报文:
响应报文:
3.URL
在首行中,包括方法、URL、版本号
在上面的请求报文的首行中,Get是方法,https://sougou.com/是URL,HTTP/1.1是版本号,下面针对URL展开讨论。
URL是用来描述网络上唯一资源的位置,在编写JDBC代码时,用到了下面一段URL:
jdbc:mysql://127.0.0.1:3306/javamysql?characterEncoding=utf8&useSSL=false
jdbc:mysql://是协议名称,即这个URL是给什么协议提供服务的,常见的协议名称还有https://等;
127.0.0.1是套访问的服务器的IP地址或域名,使用IP就可以定位到是哪一台主机;
3306是端口号,用来区分是哪个应用程序,当没有端口号时,就代表使用的是默认的端口号,http的默认端口号是80,https默认端口号是443,使用端口号就可以定位到是哪一个应用程序,IP地址和端口号就可以定位到是哪一台主机的哪一个应用程序;
javamysql是带有层次结构的路径(每一层就相当于目录,目录里还可以有子目录),表示的是想要访问的是哪个主机上的哪个程序管理的哪个资源,可以是硬盘上的文件,也可以是虚拟的资源;
characterEncoding=utf8&useSSL=false表示的是查询字符串(Query String),是对要访问的资源的补充说明,是键值对的结构,键值对之间用“&”分割,键与值之间用“=”分割,这里显示的键值对是程序员自定义的;
对于有的URL,在协议名后面还会有登录信息,但是现在基本上已经没有了;
对于文档类的网站,在URL结尾出还会有片段标识符,是用来区分当前这个页面是哪个部分的,就例如下面这个URL:
https://cn.vuejs.org/guide/introduction.html#what-is-vue
结尾处的#what-is-vue就是片段标识符。
4.UrlEncode
在URL中,包含了一些特殊字符,有 % / : . # 等,但是在查询字符串中,由于查询字符串是程序员自定义的,就有可能会出现特殊字符,造成识别错误。这是就需要对字符或其他非英语系的文字进行转义操作。
UrlEncode就是将数据的二进制的每个字节取出来,用十六进制表示,前面加上%;
例如c++的十六进制就是c%2B%2B,在网页上就是以下形式:
5.认识方法
1)GET(重要)
GET一般用于获取资源,即请求,可以获取html、css、js等;
GET请求一般是没有正文的,可以通过Query String给服务器发送数据,但GET也可以将数据放在正文中;
2)POST
POST一般用于登录、上传文件;
POST一般带有正文,正文的内容就保存了要上传的内容,但POST也可以将数据放在Query String中;
3)PUT、DELETE
PUT用于传输文件,DELETE用于删除文件,这两个可以实现Restful风格的接口。
6.GET与POST的区别(重点)
GET与POST没有本质上的区别,经常能够混着用;
1)语义上的区别
GET一般用于获取资源,即请求;POST一般用于登录、上传文件;
2)携带数据的方式
GET的数据一般放在Query String中,POST的数据一般放在正文中;
但GET也可以将数据放在正文中,POST也可以将数据放在Query String中;
3)是否幂等
幂等:请求一定,得到的响应就是一定的。
GET通常建议设计成是幂等的,POST无要求;
4)是否能被缓存
由于GET设计为幂等的,那么GET的结果就是一定的,GET的结果就可以被缓存;
由于POST对幂等没有要求,那么POST的结果就不是一定的,POST的结果就不能被缓存。
标签:协议,HTTP,GET,URL,报文,POST,端口号 From: https://blog.csdn.net/2301_79184547/article/details/145146308