Android手写OkHttp框架之Http协议简介

tech2022-09-20  61

1、前言

在Android日常开发中,网络请求是十分常见的,相信大家用的最多的就是okhttp框架的,但是却很少有人去深入了解其原理,相信大家也很想知道,在一个完整的完整的网络请求中,他的步骤是什么,是怎么发起连接的,怎么发送数据的,post请求和get请求有什么区别,TCP和Socket又是什么关系,Http是基于Socket的吗,在接下来的文章里面,我会一一介绍,如果有写的不对或者不够详细,可以给我留言。

 

2、什么是HTTP协议

百度百科解释是这样的:

http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。

虽然说已经简单的介绍了,但是对于一些刚接触这类的知识的小伙伴来说,基本上等于没看,所以我给大家以白话文的形式,幼儿园化一下,既然叫HTTP协议,那他就是一种协议,给大家举个栗子,就比如以前电视剧里的八路军对暗号,张三想把情报交给李四,

张三说:“先生打哪来啊” ,

李四说:“富强、民主、文明、和谐”

张三又问 :“先生贵姓啊” 

李四答:“自由、平等、公正、法治”

张三再问:“先生为何来此啊”

李四再答:“爱国、敬业、诚信、友善”

到处,暗号就结束了,张三就开始给李四汇报情报了,这个暗号,就相当于我们的协议,必须要按照顺序给服务器发送消息,他才会给你应答,但是http是把数据按格式封装好,一次性发送给服务器,服务器再把数据全部返回,

而这个封装的数据,就是我们的请求行,请求头,请求数据,大家可以看下面这张图片

我通过抓包软件进行抓包,可以很直观的看到这个协议的内容

我们先来简单分解一下,首先是第一行

POST 对应的就是请求方式,除了POST还有DELETE、HEAD、OPTIONS、PUT、TRACE,但是我们见得最多的还是POST,和GET

/csp-report/baike:这个就是请求地址对应服务器的地址,对应服务器的文件

HTTP/1.1 代表协议的版本,HTTP版本有 HTTP 0.9   ,HTTP 1.0 , HTTP1.1 , HTTP2.0,用的最多的还是HTTP1.1

下面的就是请求头,因为请求头内容实在太多了,我就不一一讲解了,有兴趣的可以参考下面这个链接

http://tools.jb51.net/table/http_header

请求头下面就是请求数据了,但是当请求头介绍后,必须以回车符和换行符结尾

 

上面这些就可以构成一个简单的http请求了,相信大家看到的最多的就是在浏览器上请求,其实我们只要按照这个协议,只要能连上网的设备,都能使用http,比如通过一个座机

 

3、GET和POST的区别

刚才我们说到请求方式有GET和POST,下面我们来说一下这两个的区别

GET:

安全性高,为什么安全性高呢,假如你想发送一个请求并且传入参数  GET请求的时候,在浏览器地址是这样显示的

可以看到,你的参数都是在地址后面拼接的,很不安全,

如果是同样的请求,用POST可能就是这样的

他的参数会就会在请求体里面,就不会这么容易被看到,除了这个,还有其他的区别

 

4、Http是Socket基于的吗

要搞清楚这个问题,我们先得连接Socket,那什么是Socket呢,说实话,写这篇博客之前,我也看了关于Socket的十几篇博客,都把这个理解了,今天我就用通俗易懂的语言给大家解释一下,但是在了解Socket之前必须先认识TCP/IP,如果不了解TCP/IP的可以去看我上一章的内容

https://blog.csdn.net/qq_32826071/article/details/108582726

大家知道TCP发送消息是需要三次握手,四次挥手,每次发送数据还有一大堆的头,尾标识,如果我们想发送消息,不可能每次都来三次握手,四次挥手啊,所以我们就用到Socket,他做的一件事就是把TCP/IP给封装起来,然后给你一个接口去调用,比如你想连接到服务器,那就只需要使用Socket.connect(ip,port)进行连接,连接好了之后就可以通过write()进行发送数据

之所以说Http是基于Socket的,是因为当你需要发送一个http请求的时候,你必须先通过Socket来创建TCP请求,再进行发送数据,等你发送完成后就会断开这个Socket,这就是一个Http请求的简单流程

 

 

 

最新回复(0)