TCP/IP 提供了一种通过互联网可靠地进行原始数据端到端传输的方法。
超文字传输协议 (HTTP) 是专为网络客户端与 Web 服务器交换数据而设计的应用协议。
不涉及数据应如何运输, 大多数网络使用 TCP/IP 进行传输。
客户端向服务器发送 HTTP 请求,服务器向客户端返回 HTTP 响应。
使用 HTTP 时,客户端始终以请求响应消息交换模式与服务器通信。
客户端在收到所有回复后立即关闭连接。
优势:最大限度地减少服务器需要维护的实时连接
URL用于识别 Web 上的资源
Typical format: scheme://host[:port]/path[?query][#fragment]
e.g., http://www.example.com:8080/foo/bar?p1=v1&p2=v2#abc
scheme – "how to connect & exchange data" ("http" or "https")
host – host name or IP address (where to connect)
port – port number, defaults to 80 for "http", 443 for "https".
path – a path-like string that identifies a resource at the server
query – serves like "parameters"
fragment – identify a secondary resource (e.g., id of an element within the HTML document)
HTTP方法:GET, POST, PUT, DELETE, HEAD, etc.
GET方法多用于:用户点击一个链接, 在浏览器地址栏输入URL,浏览器检索HTML所需的文件(图片,CSS等)
表单提交的时候,既可以通过GET,也可以POST
GET | POST |
无主体(仅在请求URL中携带数据) | 可以在请求URL和主体中携带数据 |
由于网址长度有限,只能携带数量有限的数据 | |
可以被当作书签,在浏览器的位置栏中可见,仅适用于通过浏览器或点击链接形成提交:不包括通过JS发送的获取请求。 (安全问题) | 如果被当作书签,仅保存网址(而不是主体中的数据)
|
可被记录在浏览器历史记录中,和/或服务器日志(安全问题)仅适用于通过浏览器或点击链接形成提交:不包括通过JS发送的获取请求。 | 可以记录网址。 主体中的内容通常不被记录下来。 |
获取请求被认为是无能的(即相同的URL始终检索相同的资源,不会造成任何副作用) | POST被认为不无能(即可能导致应用程序状态更改)。 |
重新加载(重新发送)GET请求时,浏览器不发出警告。 | 当用户尝试重新加载POST请求时,浏览器通常会发出警告。 |
检索到的资源是可缓存的。 | 除非设置相应的缓存控制或过期标题字段,否则检索的资源不可缓存。 |
请求URL中 e.g.,
/main/index.html
/foo/bar/index?123456789
/foo/bar/index?name1=value1&name2=value2
A query string 通常包含 "URL encoded" name-value pairs
大多数WEB框架支持 URL 编码/解码
HTTP请求中,每个header field 都有一个name和一个value.
完整的header列表,可参考https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
常用的header:
User-Agent: WEB客户端以及客户端操作系统的数据
Referer (一个'r'): 发出请求的网页的URL.
Cookie: Cookies
Content-Type: 主体中资源的媒体类型 ,在request中,表示数据在主体中的编码方式
HTTP主体,在请求方法为POST和PUT时携带数据,数据可以以任何形式进行编码,具体由content-type规定。
HTTP相应中的有用信息:状态行中有状态编号和原因描述 e.g.,200 OK ,404 NotFound
主体中含有请求资源,可能会是一个静态文件/一个动态生成的内容
Content-Type: 主体中资源的媒体类型(MIME type)
A script 可以动态的创建text文件, CSV文件, image, etc.
Plain text file - Content-Type: text/plain
HTML file - Content-Type: text/html
CSV file - Content-Type: text/csv
Content-Disposition: 请求WEB客户端保存的内容
e.g., Content-Disposition: attachment; filename="foo.jpg"