看看这篇5000字的文章,带你看不一样的Android-Http(1)

1.3.3 Http工作流程

参考:https://mp.weixin.qq.com/s/7sX3AY7gJomJ2ZEErUqmKA

第一步:地址解析,从url中解析协议名称,主机名,端口号和对应的页面地址。

第二步:封装http的请求数据包:这一步主要是封装自己的信息,比如在post请求时,我们会塞进一个data数据。

第三步:封装tcp包,建立连接:因为是基于tcp的协议,网络连接是tcp来完成的,必然要封装成tcp包,然后tcp再做自己工作,比如封装ip包,一层层往下传。

第四步:发送请求:数据整好了,连接也完事了,那就发送action了。

第五步:服务端响应:接受到请求,然后给出响应。

第六步:服务端关闭tcp的连接:一次通信完成之后,若conection的设置不是keep-live的话,服务端会自动关闭tcp的连接。

2.URL详解
3.1 URL含义

URL(Uniform Resource Locator)是统一资源定位符的简称,有时候也被俗称为网页地址(网址),是因特网上标准的资源的地址。

3.2 URL构成

URL构成的通用格式为:schema://host[:port#]/path/…/[?query-string][#anchor]

我们来分析各部分的含义:

| 名称 | 功能 |

| — | — |

| schema | 访问服务器以获取资源时要使用哪种协议,比如,http,https 和 FTP 等 |

| host | HTTP 服务器的 IP 地址或域名,IP地址是一个最原始的东西,必须通过IP地址才可以找到其他的计算机;而域名只是为了人们记的方便,给出的一个名字。域名的IP地址绑定了以后,当别人访问这个域名的时候就可以通过DNS解析成IP,再进行访问。 |

| port | HTTP 服务器的默认端口是 80,这种情况下端口号可以省略,如果使用了别的端口,必须指明,例如http://www.cnblogs.com:8080 |

| path | 访问资源的路径 |

| query-string | 发给 http 服务器的数据 ,比如参数 |

| #anchor | 锚,什么是锚呢?比如:http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name这个链接,锚部分就是从“#”开始到最后。本例中的锚部分是“name”。锚不是一个URL必须的部分 。默认情况下,Google的网络蜘蛛忽视URL的#部分。但是,如果你希望Ajax生成的内容被浏览引擎读取,那么URL中可以使用"#!",这里我们不过多解释 |

用事实说话,比如:

http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff

其中

| 名称 | 对应的字段 |

| — | — |

| Schema | http |

| host | www.mywebsite.com |

| path | /js/test/test.aspx |

| Query-string | name=sviergn&x=true |

| anchor | stuff |

再来张比较直观的图

3.Http 详解
3.1 Http请求详解

HTTP 的请求报文分为三个部分:请求行、请求头、请求体

3.1.1请求行

请求行(Request line)分为三个部分:请求方法、请求地址和协议版本

所以请求行的格式一般是:

举例:

GET /app/appUserAction!getUserLogin.do.html HTTP/1.1

请求地址就是我们要请求服务器的地址,协议版本是我们Http的版本比如:Http1.0、Http1.1等版本。

我们主要来说一下请求方法:

HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同的方式操作指定的资源.

| 方法名 | 功能 |

| — | — |

| GET | 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不应该用于产生“副作用”的操作中 |

| POST | 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会创建新的资源或者修改现有资源,或两者皆有。 |

| PUT | 向指定资源位置上传其最新内容 |

| DELETE | 请求服务器删除 Request-URI 所标识的资源 |

| OPTIONS | 使服务器传回该资源所支持的所有HTTP请求方法。用*来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作 |

| HEAD | 与 GET 方法一样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中关于该资源的信息(原信息或称元数据) |

| TRACE | 显示服务器收到的请求,主要用于测试或诊断 |

| CONNECT | HTTP/1.1 中预留给能够将连接改为通道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器) |

其中,最常见的是 GET 和 POST 方法,如果是 RESful 接口的话一般会用到 PUT、DELETE、GET、POST(分别对应增删查改)

补充:

RESful 是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

3.1.2请求头

请求头可用于传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格:

如图,是Fiddler抓包获取的请求头信息:

GET省略包含参数的请求… HTTP/1.1

Host: 省略…

Connection: keep-alive

User-Agent: Mozilla/5.0 (Linux; U; Android 9; zh-cn; DUK-AL20 Build/HUAWEIDUK-AL20) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/9.0 Mobile Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,image/sharpp,image/apng,image/tpg,/;q=0.8

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh-CN;q=0.8,en-GB;q=0.6,en-US;q=0.4

这个请求头信息并不能代表所有请求头信息,所以我们来说一说请求头的一些知识点:

首先,请求头通常用来传递一些附加信息,格式为:键: 值,注意冒号后面有一个空格:

请求和响应常见通用的 Header

| 名称 | 作用 |

| — | — |

| Content-Type | 请求体/响应体的类型,如:text/plain、application/json |

| Accept | 说明接收的类型,可以多个值,用,(英文逗号)分开 |

| Content-length | 请求体/响应体的长度,单位字节 |

| Content-Encoding | 请求体/响应体的编码格式,如 gzip、deflate |

| Accept-Encoding | 告知对方我方接受的 Content-Encoding |

| ETag | 给当前资源的标识,和Last-Modified、If-None-Match、If-Modified-Since配合,用于缓存控制 |

| Cache-Control | 取值一般为no-cache、max-age=xx,xx为整数,表示资源缓存有效期(秒) |

请求Header内包含常用信息如下:

| 名称 | 作用 |

| — | — |

| Authorization | 用于设置身份认证信息 |

| User-Agent | 用户标识,如:OS 和浏览器的类型和版本 |

| If-Modified-Since | 值为上一次服务器返回的Last-Modified值,用于确定某个资源是否被更改过,没有更改过就从缓存中读取 |

| If-None-Match | 值为上一次服务器返回的 ETag 值 |

| Cookie | 已有的Cookie |

| Referer | 标识请求引用自哪个地址,比如你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |

| Host | 请求的主机和端口号 |

3.1.3 请求体

请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&连接,如果请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度,就是我们通常访问服务器需要传的参数信息,如:

http://www.baidu.com/login.do?account=123456&password=99fe158e8abc9ffbd09eab0ec9d81781

根据应用场景的不同,HTTP 请求的请求体有三种不同的形式

第一种:

移动开发者常见的,请求体是任意类型的,服务器不会解析请求体,请求体的处理需要自己解析,如图:

第二种:

第二种和第三种都有固定的格式,是服务器端开发人员最先了解的两种。这里的格式要求就是 URL 中 Query String(可以理解为参数) 的格式要求:多个键值对之间用&连接,键与值之间用=连接,且只能用 ASCII 字符,非 ASCII 字符需使用UrlEncode编码。

第三种:

第三种请求体被分成多个部分,文件上传 时会被使用,这种格式最先是被用于邮件传输中,每个字段/文件都被 boundary(Content-Type中指定的)分成单独的段,每段以–加 boundary 开头,然后是该段的描述头,描述头之后空一行接内容,请求结束的标识为 boundary 后面加–

3.2 Http响应详解

HTTP 响应的格式上除状态行(第一行)与请求报文的请求行不一样之外,其他的就格式而言是一样的。

Http响应主药由三部分:响应状态行、响应头、响应体.

3.2.1 响应状态行

Http的响应状态行格式如下:

举例:

HTTP/1.1 200 OK

那我们说一下常见响应码的含义:

| 状态码 | 对应信息 |

| — | — |

| 1xx | 提示信息—表示请求已接收,继续处理 |

| 2xx | 用于表示请求已被成功接收、理解、接收 |

| 3xx | 用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向 |

| 4xx | 客户端错误—请求有语法错误或者请求无法实现 |

| 5xx | 务器端错误—服务器未能实现合法的请求 |

3.2.2 响应头

响应头同样可用于传递一些附加信息,

注:只是部分信息。

Server: nginx/1.12.2

Date: Wed, 30 Jan 2019 02:06:41 GMT

Content-Type: text/html;charset=UTF-8

Transfer-Encoding: chunked

Connection: keep-alive

Set-Cookie: JSESSIONID=96C4243B3715D585A3699BF9451D5FE3; Path=/; HttpOnly

Content-Language: zh-CN

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2019-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

[外链图片转存中…(img-Bt9OuXS6-1715345161959)]

[外链图片转存中…(img-EvPK73P1-1715345161959)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值