为什么要写这篇文章,是为okhttp源码分析做铺垫。
一、Http是什么
Http翻译成中文是超文本协议,重点词是协议。两台计算机要实现相互通信,传输规则是首先要解决的问题,要不然就是鸡同鸭讲。而且不同的操作系统不同的浏览器,如果不制定统一的通信规则,那么接收方如何去解析呢?所以就有了Http。
二、Http定义了哪些元素
1、URL
URL即网址,我们平时在浏览器中输入的一串地址,以http或者https开头。然后是域名加端口号,最后是文件路径。
如 http://www.test.com:80/index.html
www.test.com是域名,80是端口号,index.html是文件路径。这个URL代表向主机号为www.test.com这个域名 对应的ip地址的主机,请求index.html这个网页文件。web的端口号默认是80,可以省略。
而我们安卓开发最常用的URL是像这样的 http://www.test.com:8080/user/getUserInfo,前面都一样,后面的uri并不是文件的路径,而是去运行服务器中的一段程序。
2、请求消息
总共分3部分,分别是请求行、请求头、请求体。
请求行包括3项,请求方法、uri、http版本,书写规则如下:
<方法><空格><uri><空格><http版本><换行>
GET /user/getUserInfo HTTP/1.1\r\n
其中请求方法常用的也就GET POST。
再说请求头,请求头紧跟请求行,以键值对的形式书写,主要添加附加信息,书写规则如下:
<key>:<value><换行>
token:asdfaf2sdf\r\n
有多少对键值对就有多少行的头。
最后说请求体,主要包含本次请求需要向服务端提交的信息。比如表单提交,比如json字符串等。
这里有点需要注意的,表单提交如果用的是GET方法,键值对将拼接到uri后面,如/user/getUserInfo?token:asdfaf2sdf;而用POST方法,就是正常的情况放在请求体中的。
3、响应消息
总共分3部分,分别是状态行、响应头、响应体。
状态行包括3项,http版本、状态码、响应短语,书写规则如下:
<http版本><空格><状态码><空格><语><换行>
HTTP/1.1 200 success
我们常说的200响应成功,404未找到资源,就是这里的状态码。
响应头跟请求头一样,也是键值对,书写规则也一样。
响应体是服务端返回的消息内容主体,一般是二进制流的形式。而我们编程用的网络框架一般都会帮我们把流转为字符串。目前c/s交互最主流的便是json字符串。
三、ip地址
ip地址才是计算机在网络中的地址,而非域名。ip地址由4个8位数字组成,中间用.隔开,如192.168.1.1。地址包含了两部分内容,前面是网络号,后面是主机号。那么如何看哪个是哪个呢?这时候就要用到子网掩码。我们常见的以太网子网掩码是255.255.255.0,什么意思呢?其实很简单,就是让ip地址和子网掩码做&运算。192和255计算结果是192,168和255计算结果是168,1和255计算结果是1,1和0计算结果是0,最终结果是192.168.1.0,那么网络号就是192.168.1.0,主机号就是1。区分这个有什么意义呢?只有网络号相同(即在同一子网)的主机之间才能通信。那么有同学要问了,我ipconfig了一下,ip地址是192.168.1.10,我访问的网站ip地址是101开头的啊。我想说,大兄弟,你那ip是以太网的内网ip,如果要发网络包出去,需要经过路由器NAT为外网地址,最终访问的也只是外网地址,并不是192.168开头的内网地址。如果非要访问对方的内网ip也是可以的,必须要对方的路由器NAT映射表添加你想要访问的内网ip。扯远了,由于这篇文章的初衷只是为了okhttp的源码分析做铺垫,所以就先简单的介绍一下跟http相关的知识。
网友评论