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浏览器与WEBserver之间交换数据的过程。

    client连上webserver后,若想获得webserver中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义client与webserver通迅的格式。

②Http 1.0 与 Http 1.1的差别:

  • 1.0协议。client与webserver建立连接后,仅仅能获得一个web资源!
  • 1.1协议,同意client与webserver建立连接后,在一个连接上获取多个web资源!

PS:如今大部分的都是用的Http 1.1协议的~

③Http请求的工作流程:

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

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

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

  1. client发送syn包(syn = j)到server,进入SYN_SEND状态,然后等待server确认
  2. server收到syn包,确认客户的syn(ack = j + 1),同一时候在自己也发送一个SYN包(syn=k),

    即SYN + ACK包,server进入SYN_RECV状态
  3. client收到SYN + ACK包,想server发送确认包ACK(ack = k +1),发送完毕后,client与服务端

    进入ESTABLISHED状态。完毕三次握手,然后两者開始传送数据

假设你认为复杂的话,看图想想你就有个大概印象了,三次握手示意图例如以下:

Http操作的流程:

  1. 用户点击浏览器上的url(超链接)。Web浏览器与Webserver建立连接
  2. 建立连接后。client发送请求给server,请求的格式为:

    统一资源标识符(URL)+协议版本(通常是1.1)+MIME信息(多个消息头)+一个空行
  3. 服务端受到请求后。给予对应的返回信息,返回格式为:

    协议版本 + 状态行(处理结果) + 多个信息头 + 空行 + 实体内容(比方返回的HTML)
  4. client接收服务端返回信息,通过浏览器显示出来,然后与服务端断开连接;当然假设中途某步错误发生的话,错误信息会返回到client,并显示,比方:经典的404错误

好吧,No pic you say a jb,有图有真相,以下我们用HttpWatch来抓下包(当然,你也能够直接用Chrome f12),这里測试的站点是小猪学校的教务系统:输入账号password后,发送登陆请求,相关信息头。至于相关的信息头,我们下节再具体解说~:

HTTP请求包含的内容:

HTTP响应包含的内容:

④Http请求的几种方式:

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

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

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

  • GET:在请求的URL地址后以?的形式带上交给server的数据。多个数据之间以&进行分隔,但数据容量通常不能超过2K,比方:http://xxx?

    username=…&pawd=…这样的就是GET

  • POST: 这个则能够在请求的实体内容中向server发送数据,传输没有数量限制
  • 另外要说一点,这两个玩意都是发送数据的,仅仅是发送机制不一样,不要相信网上说的”GET获得server数据,POST向server发送数据”!!

    另外GET安全性非常低。Post安全性较高,可是运行效率却比Post方法好,一般查询的时候我们用GET。数据增删改的时候用POST。!

⑤Http状态码合集:

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

⑥Http协议的特点

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

  1. 支持客户/server模式。
  2. 简单高速:客户向server请求服务时。仅仅需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与server联系的类型不同。

    由于HTTP协议简单,使得HTTPserver的程序规模小,因而通信速度非常快。

  3. 灵活:HTTP同意传输随意类型的数据对象。正在传输的类型由Content-Type加以标记。

  4. 无连接:无连接的含义是限制每次连接仅仅处理一个请求。server处理完客户的请求,并收到客户的应答后。即断开连接。採用这样的方式能够节省传输时间。

    5.无状态:HTTP协议是无状态协议。

    无状态是指协议对于事务处理没有记忆能力。

    缺少状态意味着假设兴许处理须要前面的信息,则它必须重传。这样可能导致每 次连接传送的数据量增大。还有一方面。在server不须要先前信息时它的应答就较快。

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

恩,这个我们知道就能够了,兴许有须要的话再深入了解,我们的HTTP请求是出于第七层:应用层的,

大家知道就能够了,另外最好记下这七层,对了,一到三层是用于创建两个网络设备间的物理连接的。

而四到七层主要负责互操作性,背熟就好,面试说不定问下呢,是吧。哈哈~

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

另外小猪查相关资料的时候,发现一个B格更高的总结图,有兴趣的能够慢慢研究:

贴下原文链接,想刨根问底的能够看下:

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通信——1.初识Http协议的更多相关文章

  1. Android基础_web通信

    一.发展史 1G 模拟制式手机,只能进行语音通话2G 数字制式手机,增加接收数据等功能3G 智能手机,它已经成了集语音通信和多媒体通信相结合,并且包括图像.音乐.网页浏览.电话会议以及其它一些信息服务 ...

  2. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  3. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  4. 基于android的Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...

  5. Android中Socket通信之TCP与UDP传输原理

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  6. Android网络编程(一)HTTP协议原理

    相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley使用方法全解析 A ...

  7. Android呼叫管理服务之会话发起协议(SIP)API

    原文:http://android.eoe.cn/topic/android_sdk Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序. ...

  8. Android NFC近场通信02----读写卡的准备工作

                        Android NFC近场通信02----读写卡的准备工作      因为公司接了一个听上去感觉比較NB的项目.给某油田做派工系统 .并由小女子负责Androi ...

  9. 初识HTTP协议

    本篇文章从概念上初识HTTP协议,参考链接:http://www.runoob.com/http/http-tutorial.html 目录: 一.HTTP协议    HTTP 工作原理    HTT ...

随机推荐

  1. vue中的生命周期

    vue中的生命周期 1,vue生命周期简介: 1.beforeCreate 在实例初始化之后,数据观测和event/watcher时间配置之前被调用.   2.created 实例已经创建完成之后被调 ...

  2. ThinkPHP 跨模块调用操作方法(A方法与R方法)

    ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法.ThinkPHP 内 ...

  3. HDU 4318 Contest 2

    简单的一题,使用类DIJK的算法就可以了. #include <iostream> #include <cstdio> #include <queue> #incl ...

  4. [Angular] Handle HTTP Errors in Angular with HttpErrorResponse interface

    When communicating with some backend API, data travels over the network using the HTTP protocol. As ...

  5. android全磁盘加密

    android 全磁盘加密 什么是全磁盘加密? 全磁盘加密是使用一个密钥来为android设备上全部的用户数据加密的过程.一旦设备被加密,全部的用户创建的数据都将会在提交的磁盘之前自己主动加密,在读取 ...

  6. USACO runaround

    /* ID:kevin_s1 PROG:runround LANG:C++ */ #include <iostream> #include <cstdio> #include ...

  7. C++ Primer Plus的若干收获--(三)

    有时候怀疑真是怀疑自己走的路究竟是不是正确的.作为一个土生土长数学系学生,却对数学毫无兴趣,没事的时候就喜欢躲在图书馆看看有关计算机的书.有时候期末考试时候会挂个一两门的数学专业课,有时候真希望数学课 ...

  8. Codeforces Round #274 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/479 这次自己又仅仅能做出4道题来. A题:Expression 水题. 枚举六种情况求最大值就可以. 代码例如以下: #inc ...

  9. 使用Xcode-debug模式和release模式

    在开发过程中,我们常常须要用到NSLog输出一些信息,甚至有的开发过程.必须在控制台查看输出,有经验的程序猿通过控制台输出就能知道整个数据交互的一个流程. 可是一个公布的程序,里面带有太多的NSLog ...

  10. bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 (黑白染色+最小割)

    bzoj4808: 马 & bzoj3175: [Tjoi2013]攻击装置 题目:传送门 简要题意: 和n皇后问题差不多,但是这里是每个棋子走日子,而且有些格子不能放棋子.求最多能放多少个棋 ...