看看这篇5000字的文章,带你看不一样的Android-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

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

尾声

最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

[外链图片转存中…(img-V7j0IYZl-1713689558350)]

Android进阶学习资料库

一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-NtrcW2e6-1713689558351)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值