HTTP知识

HTTP定义

Hypertext Transfer Protocol,超⽂文本传输协议,和 HTML (Hypertext Markup Language 超⽂文本标 记语⾔言) ⼀一起诞⽣生,⽤用于在⽹网络上请求和传输 HTML 内容。

超⽂文本,即「扩展型⽂文本」,指的是 HTML 中可以有链向别的⽂文本的链接(hyperlink)。

URL格式

URL格式:
协议类型://服务器器地址[:端⼝号]路径

http://hencoder.com/users?gender=male

报文格式

  • 请求报文:
  • 响应报文:

HTTP方法

  • GET
  1. 用于获取资源
  2. 对服务器器数据不进行修改
  3. 不发送Body
1
2
GET  /users/1  HTTP/1.1
Host: api.github.com

对应 Retrofit 的代码:

1
2
@GET("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);

  • POST
  1. 用于增加或修改资源
  2. 发送给服务器器的内容写在Body⾥面
1
2
3
4
5
POST  /users  HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
name=rengwuxian&gender=male

对应 Retrofit 的代码:

1
2
3
4
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String
gender);

  • PUT
  1. 用于修改资源
  2. 发送给服务器器的内容写在Body里面
1
2
3
4
5
PUT  /users/1  HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
gender=female

对应 Retrofit 的代码:

1
2
3
4
@FormUrlEncoded
@PUT("/users/{id}")
Call<User> updateGender(@Path("id") String id, @Field("gender") String
gender);

  • DELETE
  1. 用于删除资源
  2. 不发送Body
1
2
DELETE  /users/1  HTTP/1.1
Host: api.github.com

对应 Retrofit 的代码:

1
2
@DELETE("/users/{id}")
Call<User> getUser(@Path("id") String id, @Query("gender") String gender);

  • HEAD
  1. 和 GET 使⽤用⽅方法完全相同
  2. 和 GET 唯⼀一区别在于,返回的响应中没有 Body

其中GET、PUT、DELETE、HEAD是幂等的。

HTTP响应码

常用响应码:

  • 100:继续,用于多段HTTP请求。
  • 101:切换协议。例如由HTTP1.1变为2.0
  • 200:请求成功。
  • 301:资源被永久移动,浏览器会自动定向到新URI。
  • 302:资源被临时移动,客户端应继续使用原有URI。
  • 400:客户端语法错误,服务器无法解析。
  • 401:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403:服务器理解请求客户端的请求,但是拒绝执行此请求。
  • 404:服务器无法根据客户端的请求找到资源。
  • 500:服务器内部错误,无法完成请求。

Header

Content-Type

内容类型,主要有四类:

  1. text/html
    请求 Web ⻚页⾯面是返回响应的类型,Body 中返回 html ⽂文本。

格式如下:

1
2
3
4
5
6
7
8
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 853
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
......

  1. x-www-form-urlencoded
    Web ⻚页⾯面纯⽂文本表单的提交⽅方式。

格式如下:

1
2
3
4
5
POST  /users  HTTP/1.1
Host: api.github.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=rengwuxian&gender=male

对应 Retrofit 的代码:

1
2
3
4
@FormUrlEncoded
@POST("/users")
Call<User> addUser(@Field("name") String name, @Field("gender") String
gender);

  1. multitype/form-data
    Web ⻚页⾯面含有⼆二进制⽂文件时的提交⽅方式。

格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
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......

对应 Retrofit 的代码:

1
2
3
4
5
6
7
8
9
10
@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);

  1. application/json , image/jpeg , application/zip …
    单项内容(⽂文本或⾮非⽂文本都可以),⽤用于 Web Api 的响应或者 POST / PUT 的请求 请求中提交 JSON。

JSON方式

请求中提交JSON:

1
2
3
4
5
POST /users HTTP/1.1
Host: hencoder.com
Content-Type: application/json; charset=utf-8
Content-Length: 38
{"name":"rengwuxian","gender":"male"}

对应 Retrofit 的代码:

1
2
3
4
@POST("/users")
Call<User> addUser(@Body("user") User user);
...
// 需要使⽤用 JSON 相关的 Converter api.addUser(user);

响应返回JSON:

1
2
3
4
5
6
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......

二进制方式

请求中提交二进制内容:

1
2
3
4
5
POST /user/1/avatar HTTP/1.1
Host: hencoder.com
Content-Type: image/jpeg
Content-Length: 1575
JFIFHH9......

对应 Retrofit 的代码:

1
2
3
4
5
6
@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)

响应中返回二进制内容:

1
2
3
4
HTTP/1.1 200 OK
content-type: image/jpeg
content-length: 1575
JFIFHH9......

Content-Length

指定 Body 的⻓长度(字节)。

Transfer: chunked (分块传输编码 Chunked Transfer Encoding)

⽤于当响应发起时,内容⻓长度还没能确定的情况下。和 Content-Length 不不同时使⽤用。⽤用途是尽早给 出响应,减少⽤用户等待。
格式:

1
2
3
4
5
6
7
8
9
10
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
4
Chun
9
ked Trans
12
fer Encoding
0

Location

指定重定向的⽬目标 URL

User-Agent

用户代理,即是谁实际发送请求、接受响应的,例如⼿机浏览器、某款手机App。

Range / Accept-Range

按范围取数据。

Accept-Range: bytes 响应报⽂文中出现,表示服务器器⽀支持按字节来取范围数据 Range: bytes=-请求报⽂文中出现,表示要取哪段数据 Content-Range:-/total 响应报⽂文中出现,表示发送的是哪段数据
作⽤:断点续传、多线程下载。

charset

编码,例如utf-8。

HTTP缓存

ETag

ETag是服务器生成并返回的随机令牌,通常是文件内容的哈希值或某个其他指纹。

验证令牌可实现高效的资源更新检查:资源未发生变化时不会传送任何数据,服务器将返回“304 Not Modified”响应。

在下一次请求中,If-None-Match的值为上次的ETag的值。服务器根据If-None-Match的值(即内容摘要)判断缓存的资源是否有效。

Cache-Control

  • no-cache:表示必须先与服务器确认返回的响应是否发生了变化,然后才能使用该响应来满足后续对同一网址的请求。
  • no-store:直接禁止浏览器以及所有中间缓存存储任何版本的返回响应。
  • public:是指资源应该被缓存,并且中间经过的代理服务器(假如有的话)也应该缓存这个资源。
  • private:是指资源应该被缓存,但是只能被客户端的浏览器缓存。
  • max-age:指令指定从请求的时间开始,允许获取的响应被重用的最长时间(单位:秒)
  • Expires:表示在某个时间点后过期。
0%