Android 深入Http(1)HTTP原理和机制(1)

有http基础的人就应该知道这些信息,其实就是http报文。

报文格式 Request


我们来分析上面那些格式:

首先第一行构成了Http的请求行

(1) 请求行

例子:GET /rikkatheworld Http/1.1

  1. GET

method,请求方法:包括GET、POST、DELETE、PUT

  1. /rikkatheworld

path,路径:给服务器看的

  1. Http/1.1

Http version:http版本,1.0和0.9基本已经废弃了,现在基本都是1.1,未来就都是2了。

当然了,除了请求行,Http的请求报文还有 Headers(请求头)和Body(请求体)。

(2) Headers

headers和请求行之间没有空行。下面为一个headers

Host:blog.csdn.net

Content-Tyoe:text/plain

Content-Lenth:50

(3) body

request可以有body,比如post请求的信息。和headers间有空行

报文格式 Response


Response是服务器给浏览器的返回的报文。分为 状态行、Headers和Body

长这个样子的:

在这里插入图片描述

也包括三个部分

状态行

状态行的格式如下:

HTTP/1.1 200 OK

  1. HTTP/1.1

version,放在状态行的最左边。

  1. 200

状态码

  1. OK

status message:一个简单的数据返回描述,服务端是可以改的。比如Fail、Success…

Headers

和状态行间没有空行

Body

和Headers有空行,是请求的数据,比如html。

接下来我们来对这些细节一步步讲述。

RequsetMethods


HTTP定义了这些请求方法,虽然说是定义是,但它不会去具体做这些事情,而是让客户端、服务端去遵从这些定义。

  1. GET

获取资源没有也不能有Body,Http的默认method就是GET

  1. POST

增加或修改资源肯定是有body的,因为增加和修改都要带上信息。比如 body:name=Rikka&age=22

  1. PUT

只修改资源,肯定是也有body的

PUT和POST其实差别不是特别大,但是一般都是用POST

  1. DELETE

删除资源,没有Body,给一个定位就可以了

比如 DELETE /users/1 HTTP/1.1 就是删除用户第1号就是了

  1. HEAD

和GET几乎一样,区别在于服务器对于HEAD的请求不返回Body。

用途:在下载的时候,我们先用HEAD去请求下载信息,服务器会返回给我们 下载内容的大小,然后我们得知了大小,再去下载。

虽然HTTP定义了多个请求方法,但是实际情况会依据用法而改变,每个公司可能并不都会使用这些方法。

比如说把 删除的功能放在GET中而不是DELETE中…

Status Code 状态码


作用:对结果做出类型化描述

  1. 1XX:临时性消息

101:比如http 1.1和2.0是不能兼容的,一个浏览器请求一个服务器,可能会先问它是不是支持http2.0,如果服务器返回101就表示支持http2.0。就是相当于一个试探消息。

100:有时候在客户端传很大消息给服务器的时候,会分段传,这个时候客户端告诉服务器,如果你收到我第一段,你就发个100,这样我就发第二段 and so on。

  1. 2XX:成功

这是最爽的

  1. 3XX:重定向

301:重定向地址

304:内容没有改变(比如刷新了一下)

  1. 4XX:客户端错误

400:请求有问题,比如参数不对

401:没有权限(比如没有登录就去申请资源)

404:资源不存在

  1. 5XX:服务器错误

500:服务器崩了(错误)

503:服务器超载或者某种原因导致了不可用

这里有参考的比较全的http状态码:常见的HTTP错误状态码

Headers

=======================================================================

请求头,在请求行的下面并且没有隔一行。

作用:传送 HTPP消息的元数据(metadata)

元数据就是数据的属性。比如说文本的格式、文本的长度…

它有下面这些属性:

Host


它展示服务器主机地址。但它不是用来寻址的!

寻址的时候是在url拼成request报文的时候通过DNS就寻址完了。这是ip层来做的。

它的作用也是给服务器看的。这是为什么呢?

这是因为一个服务器下面会有子服务器,这些子服务器对外的ip是一样的,所以需要这样的Host来告诉服务器是具体哪个子服务器,一般是 域名+Tcp端口

Content-Type/Conent-Length


这两个字段大多是出现在POST、PUT中,客户端要求服务端做的事情。

  1. Content-Length:要求服务器读取内容的长度(字节)

就是去服务器读这么长的长度的Body内容。

为什么要设置这么一个字段呢?为什么我们不能使用分隔符分开,让服务器好认呢?

这是因为如果文本是一个二进制的数据,那么就不可能出现分隔符了,所以为了统一,就用Content-Length去读指定的长度

  1. Content-Type:文本类型,即客户端传输数据的类型

比如 text/html就是一个html的文本,再比如 application/jason就是json信息

这里有一个完整的Conent-Type对照表:HTML Content-Type对照表

这里讲几个比较重要的content-type:

(1)application/x-www-form-urlencoded:纯文字表单,不能传输二进制数据(或者必须要提前声明),encoded URL格式

这表示客户端提交的是一个表单。这说明该Request是POST,这会让服务端去查看Request的Body,Body上面会有表单的信息系。

这个Content-Type对应Retrofit的@FormUrlEncoded 注解。

(2)mutipart/form-data:多部分形式,一般用于传输二进制内容的多项内容

它里面可能会包含boundary字段:表示分界线,分界header和body。这是因为二进制的内容比较多,所以为了便于识别每段内容,加了分界线。

二进制的内容比如图片。

application/x-www-form-urlencoded也可以用来传二进制,但是二进制一般都是特别长,这样的处理会占带宽。

(3)application/json

一般都是用来接收数据,一般都是放在Response的Body里面的

一般不用于Requeset中

(4)image/jpeg

只用来传文件,而且是单文件,用于POST请求中。相交于第二个的mutipart使用更加方便。

Chunked Transfer Encoding:分块传输编码


有时候服务器可能会传回很多的数据,其中有一部分可以返回客户端了,还有还要等一部分服务端处理,处理完再传(这个部分很快,但是可能也要几百毫秒),这个时候,为了提升用户体验,就用分段传输了。

当然了服务端要处理超过5s 10s的数据,就不会使用到这个字段了。

Trasnfer-Encoding:chunked

Body格式:

< lenth1>

< data1>

< lenth2>

< data2>

0(结束标识)

比如:

5

rikka

3

the

5

world

0

lenth都很长的,上面只是举例。

Location


重定向指向的url,放在Response中。

一般有这个重定向后,会再走一遍http

User-Agent


用户代理。

都是 Mozilla/xxx

Mozilla是火狐前身(当年Mozilla是浏览器老大)

早期是为了区分一个网页在不同的浏览器的适配和渲染。后来都统一了,技术都成熟了。

Range/Accept-Range


指定Body的内容范围。

用在支持分段下载的时候需要指定内容。一般 用于断点续传。

比如 一个2m的图片给它的请求头设置range :bytes = 1m

那么得到的就是一半的图片。

Accept


客户端可以接受的数据类型 比如 text/html

Accept-Charset


客户端可以接受的字符集 ,比如 utf-8

Accept-Encoding


客户端接受的编码类型,如gzip

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

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

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

img

img

img

img

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

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

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

最后

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

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

[外链图片转存中…(img-n6VYvVaT-1713762406308)]

最后

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-oO9c0J1r-1713762406309)]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值