说到网络,就不得不先说一下HTTP。
HTTP的概念、原理、工作机制、数据格式
HTTP的定义
一种网络传输协议,位于TCP /IP协议族的最顶层——应用层
HTTP
HypertextTransferProtocol,超文本传输协议,和HTML(HypertextMarkupLanguage超文本标记语言)一起诞生,用于在网络上请求和传输HTML内容。超文本,即「扩展型文本」,指的是HTML中可以有链向别的文本的链接(hyperlink)。
HTTP 的工作方式
浏览器:
用户输入地址后回车或点击链接 -> 浏览器拼装 HTTP 报文并发送请求给服务器 -> 服务器处理请求后发送响应报文给浏览器 -> 浏览器解析响应报文并使用渲染引擎显示到界面
手机 App:
用户点击或界面自动触发联网需求 -> Android 代码调用拼装 HTTP 报文并发送请求到服务器 -> 服务器处理请求后发送响应报文给手机 -> Android 代码处理响应报文并作出相应处理(如储存数据、加工数据、显示数据到界面)
URL 和 HTTP 报文
URL 格式
三部分:协议类型、服务器地址(和端口号)、路径(Path) 协议类型://服务器地址[:端口号]路径http://hencoder.com/users?gender=male
报文格式
请求报文
响应报文
幂等 (idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
幂等有以下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) =abs(abs(a)) 。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x
Request Method 请求方法
GET(幂等)
用于获取资源,无需body
GET /users/1 HTTP/1.1
Host: api.github.com
对应 Retrofit 的代码:
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);POST
POST(不幂等)
用于增加或修改资源
发送给服务器的内容写在 Body 里面
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 13
name=xxx&gender=male
发送给服务器的内容写在body里面
对应 Retrofit 的代码:
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
PUT(幂等)
用于修改资源
发送给服务器的内容写在 Body 里面
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 13
gender=male
对应 Retrofit 的代码:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id, @Field("gender") String gender);
DELETE(幂等)
用于删除资源
不用发送body
DELETE /users/1 HTTP/1.1
Host: api.github.com
对应 Retrofit 的代码:
@DELETE("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);
HEAD(幂等)
和GET使用方法完全相同
和GET唯一的区别在于,返回的响应中没有body
Status Code 状态码
三位数字,用于对响应结果做出类型化描述(如「获取成功」「内容未找到」)。
1xx:临时性消息。如:100 (继续发送)、101(正在切换协议)
2xx:成功。最典型的是 200(OK)、201(创建成功)。
3xx:重定向。如 301(永久移动)、302(暂时移动)、304(内容未改变)。
4xx:客户端错误。如 400(客户端请求错误)、401(认证失败)、403(被禁止)、404(找不到内容)。
5xx:服务器错误。如 500(服务器内部错误)。
Header 首部
作用:HTTP 消息的 metadata。
Host
目标主机。注意:不是在网络上用于寻址的,而是在目标服务器上用于定位子服务器的。
Content-Type
指定 Body 的类型。主要有四类:
1.text/html
请求 Web 页面是返回响应的类型,Body 中返回 html 文本。格式如下:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 853
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
......
2.x-www-form-urlencoded(常用)
Web 页面纯文本表单的提交方式。
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded Content-Length: 27
name=rengwuxian&gender=male
对应 Retrofit 的代码:
@FormUrlEncoded @POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String gender);
3.multitype/form-data
Web 页面含有二进制文件时的提交方式。(如上传文件)
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MAsdkTrZu0gW Content-Length: 2352
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
xxx
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg" Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa......
------WebKitFormBoundary7MA4YWxkTrZu0gW--
对应 Retrofit 的代码:
@Multipart
@POST("/users")
Call<User> addUser(@Part("name") RequestBody name, @Part("avatar") RequestBody avatar);
RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"),
nameStr);
RequestBody avatarPart = RequestBody.create(MediaType.parse("image/jpeg"), avatarFile);
api.addUser(namePart, avatarPart);
4.application/json , image/jpeg , application/zip ...
单项内容(文本或非文本都可以),用于 Web Api 的响应或者 POST / PUT 的请求
如在请求中提交 JSON
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8 Content-Length: 38
{"name":"xxx","gender":"male"}
对应 Retrofit 的代码:
@POST("/users")
Call<User> addUser(@Body("user") User user);
...
// 需要使用 JSON 相关的 Converter
api.addUser(user);
Content-Length
指定 Body 的长度(字节)。
Transfer: chunked (分块传输编码 Chunked Transfer Encoding)
用于当响应发起时,内容长度还没能确定的情况下。和 Content-Length 不同时使用。用途是尽早给出响应,减少用户等待。
Location
指定重定向的目标 URL
User-Agent
用户代理,即是谁实际发送请求、接受响应的,例如手机浏览器、某款手机 App。
Range / Accept-Range
Accept-Range: bytes:响应报文中出现,表示服务器支持按字节来取范围数据
Range: bytes=<start>-<end>:请求报文中出现,表示要取哪段数据
Content-Range:<start>-<end>/total:响应报文中出现,表示发送的是哪段数据
作用:断点续传、多线程下载
其他 Headers
Accept: 客户端能接受的数据类型。如 text/html
Accept-Charset: 客户端接受的字符集。如 utf-8
Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
Content-Encoding:压缩类型。如 gzip
Cache
作用:在客户端或中间网络节点缓存数据,降低从服务器取数据的频率,以提高网络性能。
RESTFUL
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
RESTFUL特点包括:
1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。 [1]
这些内容是看了扔物线朱凯大神的课后,大神讲的很详细很通俗易懂,自己再做个总结与回顾