网络请求
网络请求/返回规范
HTTP请求
HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。
虽然它们也可以是名词,但这些请求方法通常被称为 HTTP 动词。
每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享:例如一个请求方法可以是安全的、幂等的或可缓存的。
最常用的请求方法是 GET 和 POST:
GET:
GET 方法请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。
HEAD:
HEAD 方法请求一个与 GET 请求的响应相同的响应,但没有响应体。
POST:
POST 方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。
PUT:
PUT 方法用有效载荷请求替换目标资源的所有当前表示。
DELETE:
DELETE 方法删除指定的资源。
CONNECT:
CONNECT 方法建立一个到由目标资源标识的服务器的隧道。
OPTIONS:
OPTIONS 方法用于描述目标资源的通信选项。
TRACE:
TRACE 方法沿着到目标资源的路径执行一个消息环回测试。
PATCH:
PATCH 方法用于对资源应用部分修改。
两段典型的请求:
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
POST /contact_form.php HTTP/1.1
Host: developer.mozilla.org
Content-Length: 64
Content-Type: application/x-www-form-urlencoded
name=Joe%20User&request=Send%20me%20one%20of%20your%20catalogue
服务器响应
当收到用户代理发送的请求后,Web 服务器就会处理它,并最终送回一个响应。与客户端请求很类似,服务器响应由一系列文本指令组成,并使用 CRLF 分隔,它们被划分为三个不同的块:
第一行是状态行,包括使用的 HTTP 协议版本,然后是一个状态码(及其人类可读的描述文本)。
接下来每一行都表示一个 HTTP 标头,为客户端提供关于所发送数据的一些信息(如类型、数据大小、使用的压缩算法、缓存指示)。与客户端请求的头部块类似,这些 HTTP 标头组成一个块,并以一个空行结束。
最后一块是数据块,包含了响应的数据(如果有的话)。
一段典型的响应:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 55743
Connection: keep-alive
Cache-Control: s-maxage=300, public, max-age=0
Content-Language: en-US
Date: Thu, 06 Dec 2018 17:37:18 GMT
ETag: "2e77ad1dc6ab0b53a2996dfd4653c1c3"
Server: meinheld/0.6.1
Strict-Transport-Security: max-age=63072000
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Vary: Accept-Encoding,Cookie
Age: 7
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>A simple webpage</title>
</head>
<body>
<h1>Simple HTML webpage</h1>
<p>Hello, world!</p>
</body>
</html>
响应状态码
HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。 响应被归为以下五大类:
信息响应 (100–199)
成功响应 (200–299)
重定向消息 (300–399)
客户端错误响应 (400–499)
服务端错误响应 (500–599)
JSON
JavaScript Object Notation (JSON) 是一种数据交换格式。尽管不是严格意义上的子集,JSON 非常接近 JavaScript 语法的子集。
基本语法
JSON-text = object / array
begin-array = ws %x5B ws ; [ 左方括号
begin-object = ws %x7B ws ; { 左大括号
end-array = ws %x5D ws ; ] 右方括号
end-object = ws %x7D ws ; } 右大括号
name-separator = ws %x3A ws ; : 冒号
value-separator = ws %x2C ws ; , 逗号
ws = *(
%x20 / ; 空格
%x09 / ; 垂直制表符
%x0A / ; 换行符
%x0D ; 回车符
)
value = false / null / true / object / array / number / string
false = %x66.61.6c.73.65 ; false
null = %x6e.75.6c.6c ; null
true = %x74.72.75.65 ; true
object = begin-object [ member *( value-separator member ) ]
end-object
member = string name-separator value
array = begin-array [ value *( value-separator value ) ] end-array
number = [ minus ] int [ frac ] [ exp ]
decimal-point = %x2E ; .
digit1-9 = %x31-39 ; 1-9
e = %x65 / %x45 ; e E
exp = e [ minus / plus ] 1*DIGIT
frac = decimal-point 1*DIGIT
int = zero / ( digit1-9 *DIGIT )
minus = %x2D ; -
plus = %x2B ; +
zero = %x30 ; 0
string = quotation-mark *char quotation-mark
char = unescaped /
escape (
%x22 / ; " 引号 U+0022
%x5C / ; \ 反斜杠 U+005C
%x2F / ; / 正斜杠 U+002F
%x62 / ; b 退格符 U+0008
%x66 / ; f 换页符 U+000C
%x6E / ; n 换行符 U+000A
%x72 / ; r 回车符 U+000D
%x74 / ; t 制表符 U+0009
%x75 4HEXDIG ) ; uXXXX U+XXXX
escape = %x5C ; \
quotation-mark = %x22 ; "
unescaped = %x20-21 / %x23-5B / %x5D-10FFFF
HEXDIG = DIGIT / %x41-46 / %x61-66 ; 0-9, A-F, or a-f
; HEXDIG 等效于 [RFC5234] 中的 HEXDIG 规则
DIGIT = %x30-39 ; 0-9
; DIGIT 等效于 [RFC5234] 的 DIGIT 规则
示例:
{
"browsers": {
"firefox": {
"name": "Firefox",
"pref_url": "about:config",
"releases": {
"1": {
"release_date": "2004-11-09",
"status": "retired",
"engine": "Gecko",
"engine_version": "1.7"
}
}
}
}
}