Android之Http通信——1.初识Http协议

Android之Http通信——1.初识Http协议

引言:


今天是六一儿童节,先在这里给各位超龄儿童说声节日快乐哈~( ╯□╰ ),小猪也象征性地给群里的小朋友们派了红包…嗯,忙碌的五月终于过去了,做毕设,写论文,拍毕业照,答辩,辞职,各种各样的事,也算忙完了,好吧,小猪现在又在一家新的公司上班了,第三间公司了,你们肯定会觉得小猪三心二意是吧,毕竟才差不多毕业就换了那么多家公司,然后可能问我,”小猪你什么时候跳第四间公司”,哈哈,应该不会了哈,怎么说呢,其实我还是很专一的,毕竟我才刚毕业,我还暂时不需要去养家糊口,赡养老人,而且我没女朋友,哈哈~所以趁着年轻,选择适合自己的生长的土壤,学多点本事,工资其实没什么,真的,能学到东西才是关键,等真正有本事了,那个时候就可以谈工资了,比如我这个公司的大牛(不过这周已跳槽到魅族了),第一次感觉到大牛的气息,B格真心高,自愧不如,人家自己写组件,推送,各种代码封装,各种设计模式,而且会服务端,测试,IOS…有点看小说里,一个刚入门的小学徒看到一个宗师级别的高手时那种感觉,曾经,小猪自卑了几天,一直在想,我真的能接手他的项目吗?或者说看懂他代码?又或者我能否写出这样的代码?那几天,整个人都很浮躁,各种负面情绪,连代码都看不进去;后来不经意看到了一个讲设计的TED演讲,标题是:《如何成为一名优秀的设计师:罗子雄》,这个虽然不是说编程的,但是其实很多东西都是相通的,分为两个阶段:入门&准专业级,”你们希望你们希望成为一名设计师,但不止如此,你们希望成为的是一名优秀的设计师。但没有人生下来就是优秀的,没有人生下来就是牛逼的,没有人生下来就会UI设计,会平面设计,会网页设计。”,从入门到准专业级,我们需要多少经验?”格拉德威尔在《异类》一书中指出:“人们眼中的天才,并非卓越非凡,而是付出了持续不断的努力,一万小时的锤炼是任何人从平凡变成超凡的必要条件。”一万小时,也就是说你每天工作8小时的时间,每周工作5天,你需要5年。你无需天才,无需智商过人,无需三头六臂,无需头上长角,你只需要持续的、坚持的努力,有正确的方法,就能够在设计领域,一个专业中独当一面。”看完,整个人就阔让开朗了,心也就静下来了,对啊,人家做多久,我做多久了?人家做五年了,我只是个刚毕业的实习生,不会很正常啊,很多东西,急不来,每天有规划,一步一个脚印,日积月累,坚持5年,或者不用,我也能成为一个准专业级的大牛是吧,所以何必自卑呢~恩呢,心灵鸡汤的东西就讲这么多吧,喝多了酒没作用了,视频还是不错的,有兴趣可以看看哈,好了,从今天开始小猪会在学习公司项目的同时总结相关的一些东西,然后分享给大家,第一个章节讲解的是Android中的Http通信,先叙述下Http相关的一些概念,然后讲下Android上发送Http请求的两种方式:HttpUrlConnection与HttpClient,然后使用retrofit框架封装我们的HTTP请求,最后用RxJava实现响应式编程,实现网络的异步请求调用,当然小猪也是在学习当中,如果有什么写得不对的地方,欢迎指出,万分感激~


正文:

1.Http是什么鬼?

①名词解析:

  • hypertext transfer protocol(超文本传输协议),TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。

②Http 1.0 与 Http 1.1的区别:

  • 1.0协议,客户端与web服务器建立连接后,只能获得一个web资源!
  • 1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源!

PS:现在大部分的都是用的Http 1.1协议的~

③Http请求的工作流程:

这里先介绍两个名词,SYN和ACK

  • SYN(synchronous):TCP/IP建立连接时使用的握手信号
  • ACK(Acknowledgement):确认字符,确认发来的数据已经接受无误

接着说下TCP/IP三次握手的概念:

  1. 客户端发送syn包(syn = j)到服务器,进入SYN_SEND状态,然后等待服务器确认
  2. 服务器收到syn包,确认客户的syn(ack = j + 1),同时在自己也发送一个SYN包(syn=k),
    即SYN + ACK包,服务器进入SYN_RECV状态
  3. 客户端收到SYN + ACK包,想服务器发送确认包ACK(ack = k +1),发送完毕后,客户端与服务端
    进入ESTABLISHED状态,完成三次握手,然后两者开始传送数据

如果你觉得复杂的话,看图想想你就有个大概印象了,三次握手示意图如下:

Android之Http通信——1.初识Http协议_第1张图片

Http操作的流程:

  1. 用户点击浏览器上的url(超链接),Web浏览器与Web服务器建立连接
  2. 建立连接后,客户端发送请求给服务器,请求的格式为:
    统一资源标识符(URL)+协议版本号(一般是1.1)+MIME信息(多个消息头)+一个空行
  3. 服务端受到请求后,给予相应的返回信息,返回格式为:
    协议版本号 + 状态行(处理结果) + 多个信息头 + 空行 + 实体内容(比如返回的HTML)
  4. 客户端接收服务端返回信息,通过浏览器显示出来,然后与服务端断开连接;当然如果中途某步发生错误的话,错误信息会返回到客户端,并显示,比如:经典的404错误

好吧,No pic you say a jb,有图有真相,下面我们用HttpWatch来抓下包(当然,你也可以直接用Chrome f12),这里测试的网站是小猪学校的教务系统:输入账号密码后,发送登陆请求,相关信息头,至于相关的信息头,我们下节再详细讲解~:

HTTP请求包含的内容:

Android之Http通信——1.初识Http协议_第2张图片

HTTP响应包括的内容:

Android之Http通信——1.初识Http协议_第3张图片

④Http请求的几种方式:

我们看到上面我们发送http请求的方式是POST,它和GET在我们平时开发中使用较多,下面我们就罗列出所有的请求方式吧:

  • Get:请求获取Request-URI所标识的资源
  • POST:在Request-URI所标识的资源后附加新的数据
  • HEAD 请求获取由Request-URI所标识的资源的响应信息报头
  • PUT:请求服务器存储一个资源,并用Request-URI作为其标识
  • DELETE:请求服务器删除Request-URI所标识的资源
  • TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT:保留将来使用
  • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项

好吧,除了GET和POST其他的,笔者也没用过,所以,这里只区分GET和POST的区别:

  • GET:在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,但数据容量通常不能超过2K,比如:http://xxx?username=…&pawd=…这种就是GET
  • POST: 这个则可以在请求的实体内容中向服务器发送数据,传输没有数量限制
  • 另外要说一点,这两个玩意都是发送数据的,只是发送机制不一样,不要相信网上说的”GET获得服务器数据,POST向服务器发送数据”!!
    另外GET安全性非常低,Post安全性较高,但是执行效率却比Post方法好,一般查询的时候我们用GET,数据增删改的时候用POST!!

⑤Http状态码合集:

  1. 100~199 : 成功接受请求,客户端需提交下一次请求才能完成整个处理过程
  2. 200: OK,客户端请求成功
  3. 300~399:请求资源已移到新的地址(302,307,304)
  4. 401:请求未授权,改状态代码需与WWW-Authenticate报头域一起使用
  5. 403:Forbidden,服务器收到请求,但是拒绝提供服务
  6. 404:Not Found,请求资源不存在,这个就不用说啦
  7. 500:Internal Server Error,服务器发生不可预期的错误
  8. 503:Server Unavailable,服务器当前不能处理客户端请求,一段时间后可能恢复正常

⑥Http协议的特点

好吧,这些东西知道就可以了,小猪就不自己慢慢扣了,直接复制粘贴哈~

  1. 支持客户/服务器模式。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每 次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

⑦OSI七层协议&TCP四层协议;

恩,这个我们知道就可以了,后续有需要的话再深入了解,我们的HTTP请求是出于第七层:应用层的,
大家知道就可以了,另外最好记下这七层,对了,一到三层是用于创建两个网络设备间的物理连接的,
而四到七层主要负责互操作性,背熟就好,面试说不定问下呢,是吧,哈哈~

OSI七层协议图&TCP四层模型图:

Android之Http通信——1.初识Http协议_第4张图片

另外小猪查相关资料的时候,发现一个B格更高的总结图,有兴趣的可以慢慢研究:
Android之Http通信——1.初识Http协议_第5张图片

贴下原文链接,想刨根问底的可以看下:

OSI七层模型详解

总结:

好吧,因为时间比较仓促,毕竟只能下班的时候写写,可能有点乱,望体谅,有时间会重新捋一捋思路,部分内容参考的慕课网的”Android HTTP通信“视频的 内容,有兴趣可以去慕课看看,恩,最后总结下本节的东东吧:

  1. 介绍了下HTTP协议的一些概念、
  2. 简单的说了下HTTP 1.0 和HTTP 1.1的区别
  3. HTTP请求的流程,包括SYN和ACK的概念,TCP/IP三次握手,HTTP操作的流程,HTTP请求的几种几种方式,HTTP状态码合集,以及HTTP协议特点
  4. OSI七层协议图&TCP四层模型图

本节都是一些概念性的东西,了解了解就好,下一节,我们来研究不同的响应头,我们服务端通过设置不同的响应头来控制浏览器的一些行为,比如页面从定向,定时刷新,提示文件下载等,敬请期待~好了,洗澡睡觉,明天继续上班哼(ˉ(∞)ˉ)唧~

PS:刚舍友路过,问我一晚上在扣什么?写代码么,我说写博,然后他又问这能赚钱么?我说不能,然后他说,那写了有个卵用…我也不知道怎么跟他解释,每个人的看法,价值观不同吧,我喜欢写博,尽管我不是大牛,我写出来的东西B格也没人家高,可能都是一些基础的东西,尽管如此,我还是愿意在下班吃完饭后,埋头码字一个晚上,不积跬步何以千里,持续的,坚持的努力,再加上正确的方法,小猪也有成为大牛的那一天的,另外,把摸索出来的方法写出来,又可以方便后来者,何乐而不为呢?是吧!与各位攻城狮们共勉~加油

你可能感兴趣的:(Android之Http通信,android,http,http协议,POST-GET,结果码)