Http 详解
HTTP 的定义
HTTP即是:Hypertext Transfer Protocol,超文本传输协议,⼀种⽹络传输协议,位于 TCP / IP 协议族的最顶层——应⽤层
URL
说到HTTP,不得不说URL,URL(统一资源定位符)是URI(统一资源标识符)的一个子集,用来标识网络上某一资源的位置。
URL格式:
三部分:协议类型、服务器地址(和端⼝号)、路径(Path)
也即是:协议类型://服务器地址[:端⼝号]路径
HTTP报文格式
请求报文:
请求报文分为三部分:请求行、请求头、请求体
请求行:方法类型:路径 Http版本
请求头:主机地址,内容编码、内容长度、Cookie等
请求体:请求携带的参数,GET请求会携带在URL后面(有长度限制),POST请求稍微复杂,后面会将到
响应报文:
同样,响应报文也分为三部分:状态行、响应头、返回内容
Request Method 请求⽅法
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
实际对Android开发来说,常用的方法就是GET和POST,这里主要对这两种请求方法做讲解
GET请求
- 用途:⽤用于获取资源
- 对服务器器数据不进⾏修改
- 不发送 Body
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id);
POST请求
- ⽤用于增加或修改资源
- 发送给服务器器的数据带在body里面
@FormUrlEncoded
@POST("/users/update")
Call<User> addUser(@Field("name") String name;
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中的Content-Type
指定 请求报文或者响应报文中Body 的类型。主要有四类:
- text/html
- x-www-form-urlencoded
- multitype/form-data
- application/json , image/jpeg , application/zip 等
1、text/html类型
请求 Web ⻚⾯是返回响应的类型,Body 中返回 html ⽂本。格式如下:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1111
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
......
2、x-www-form-urlencoded
Web ⻚⾯纯⽂本表单的提交⽅式
3、multitype/form-data
Web ⻚⾯含有⼆进制⽂件时的提交⽅式
格式如下:
POST /users HTTP/1.1
Host: api.github.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MDofjOjejdljXiqP
Content-Length: 8838
------WebKitFormBoundary77MDofjOjejdljXiqP
Content-Disposition: form-data; name="name"
nyc
------WebKitFormBoundary7MDofjOjejdljXiqP
Content-Disposition: form-data; name="header"; filename="header.jpg"
Content-Type: image/jpeg
JeOdiosfewjosfDSJofoodSODFosfd......
------WebKitFormBoundary7MDofjOjejdljXiqP--
@Multipart
@POST("/users/update")
Call<User> addUser(@Part("name") RequestBody name, @Part("header")
RequestBody header);
RequestBody namePart = RequestBody.create(MediaType.parse("text/plain"),
nameStr);
RequestBody headerPart = RequestBody.create(MediaType.parse("image/jpeg"),
headerFile);
api.addUser(namePart, headerPart);
4、application/json , image/jpeg , application/zip
单项内容(⽂本或⾮⽂本都可以),⽤于 Web Api 的响应或者 POST / PUT 的请求或者GET请求
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 288
{"name":"nyc"}
对应 Retrofit 的代码:
@POST("/users/update")
Call<User> addUser(@Body("user") User user);
api.addUser(user);
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 234
[{"login":"mojombo","id":1,"node_id":"MDQ6VXNl
cjE=","header_url":"https://profile.csdnimg.cn/0/5/F/1_weixin_46055193""......
header中的Content-Length
指定 Body 的⻓度(字节)。
Transfer: chunked (分块传输编码 Chunked Transfer Encoding)
⽤于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使⽤。⽤途是尽早给
出响应,减少⽤户等待。
Header中的User-Agent
⽤户代理,即是谁实际发送请求、接受响应的,例如⼿机浏览器、某款⼿机 App.
Header中的Range / Accept-Range
按范围取数据Accept-Range: bytes 响应报⽂中出现,表示服务器⽀持按字节来取范围数据
Range: bytes=- 请求报⽂中出现,表示要取哪段数据
Content-Range:-/total 响应报⽂中出现,表示发送的是哪段数据
作⽤:断点续传、多线程下载
Cache
作⽤:缓存数据以降低从服务器取数据的频率,以加快响应速度和提⾼⽹络使用率
其他Headers
Accept: 客户端能接受的数据类型。如 text/html
Accept-Charset: 客户端接受的字符集。如 utf-8
Accept-Encoding: 客户端接受的压缩编码类型。如 gzip
Content-Encoding:压缩类型。如 gzip
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)