Hypertext Transfer Protocol,超⽂本传输协议,和 HTML (Hypertext Markup Language 超⽂本标记语⾔) ⼀起诞⽣
鬼影的知识总结 |
Http
Hypertext Transfer Protocol,超⽂本传输协议,和 HTML (Hypertext Markup Language 超⽂本标记语⾔) ⼀起诞⽣
定义
⼀种⽹络传输协议,位于 TCP / IP 协议族的最顶层——应⽤层
用途
⽤于在⽹络上请求和传输 HTML 内容。
HTTP报文
请求报文
响应报文
工作方式
浏览器
服务器处理请求后发送响应报文给浏览器
浏览器解析响应报⽂并使⽤渲染引擎显示到界⾯
手机app
Android 代码调⽤拼装 HTTP 报⽂并发送请求到服务器
服务器处理请求后发送响应报⽂给⼿机
Android 代码处理响应报⽂并作出相应处理(如储存数据、加⼯数据、显示数据到界⾯)
URL
协议类型://服务器地址[:端⼝号]路径
http://hencoder.com/users?gender=male
协议类型
路径(Path)
服务器地址(和端⼝号)
Request Method 请求⽅法
GET
⽤于获取资源
对服务器数据不进⾏修改
不发送 Body
ex: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
⽤于增加或修改资源
发送给服务器的内容写在 Body ⾥⾯
ex:POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=rengwuxian&g
Retrofit:
@FormUrEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String
gender);
DELETE
⽤于增加或修改资源
发送给服务器的内容写在 Body ⾥⾯
ex: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);
PUT
⽤于修改资源
发送给服务器的内容写在 Body ⾥⾯
ex:
PUT /users/1 HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
gender=female
Retrofit:
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id, @Field("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(服务器内部错误)
REST
REST 的定义众说纷纭,没有统⼀答案
Cache
作⽤:在客户端或中间⽹络节点缓存数据,降低从服务器取数据的频率,以提⾼⽹络性能
Header ⾸部
Host
⽬标主机注意:不是在⽹络上⽤于寻址的⽽是在⽬标服务器上⽤于定位⼦服务
Content-Type
指定 Body 的类型。主要有四类
text/html
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 853
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
......
x-www-form-urlencoded
对应 Retrofit 的代码:
POST /users HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=rengwuxian&gender=mal
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String
gender);
multipart/form-data
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: multipart/form-data; boundary=----
WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 2382
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
rengwuxian
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avatar"; filename="avatar.jpg"
Content-Type: image/jpeg
JFIFHHvOwX9jximQrWa.....
------WebKitFormBoundary7MA4YWxkTrZu0gW--
扔物线学堂 rengwux
@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);
application/json , image/jpeg , application/zip ...
应 Retrofit 的代码:
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"name":"rengwuxian","gender":"male"}
@POST("/users")
Call<User> addUser(@Body("user") User user);
...
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
content-length: 234
[{"login":"mojombo","id":1,"node_id":"MDQ6VXNl
cjE=","avatar_url":"https://avatars0.githubuse
rcontent.com/u/1?v=4","gravat......
POST /user/1/avatar HTTP/1.1
Host: hencoder.com
Content-Type: image/jpeg
Content-Length: 1575
JFIFHH9
对应 Retrofit 的代码:
相应中返回⼆进制内容
@POST("users/{id}/avatar")
Call<User> updateAvatar(@Path("id") String id, @Body RequestBody avatar);
...
RequestBody avatarBody = RequestBody.create(MediaType.parse("image/jpeg"),
avatarFile);
api.updateAvatar(id, avatarBody)
HTTP/1.1 200 OK
content-type: image/jpe
content-length: 1575
JFIFHH9......
Content-Length
指定 Body 的⻓度(字节)。
Transfer: chunked (分块传输编码 Chunked Transfer
Encoding)
⽤于当响应发起时,内容⻓度还没能确定的情况下。和 Content-Length 不同时使⽤。⽤途是尽早给出
响应,减少⽤户等待。
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
4
Chun
9
ked Trans
12
fer Encoding
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
仍物线建议
REST HTTP 即正确使⽤ HTTP。包括:
使⽤资源的格式来定义 URL
规范地使⽤ method 来定义⽹络请求操作
规范地使⽤ status code 来表示响应状态
其他符合 HTTP 规范的设计准则