HTTP

HTTP是什么

超文本传输协议,HyoprText Transfer Protocol 一种通信协议,用于网络通信

协议:只有智能足够高,沟通才不需要协议

超文本:HTML,最初诞生就是为了传输html,超指的是可扩展

HTTP工作方式

浏览器就是对html进行渲染变为可视化网页

URL如何转为HTTP报文

全称Uniform Resoure Locator 统一资源定位符,网络资源所在地址,也就是我们常说的网址。

http:/ /www.baidu.com/ user?gender=male

上面的地址对应了:协议类型 服务器地址 路径

GET请求与应答报文示例

---- 请求行 ----
GET /path HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识

--- 空行 ---
--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据
请求方式
GET 获取资源
POST 可以增加和修改资源 非幂等

在编程开发中,对于幂等的定义为:无论对某一个资源操作了多少次,其影响都应是相同的。 换句话说就是:在接口重复调用的情况下,对系统产生的影响是一样的,但是返回值允许不同,如查询。

PUT 修改
DELETE 删除
HEAD 获取资源查看head,没有Body
状态码
  • 1XX 临时性消息 101切换协议 100多个请求合并
  • 2XX 成功
  • 3XX 重定向,一般是资源迁移
  • 4XX 客户端错误 资源不存在,无权限等
  • 5XX 服务器异常
HOST

并不是用来定位目标主机,定位主机是通过域名然后DNS查询ip地址

是服务器用来确定子主机,所以域名有两个作用:查询主机地址,然后定位子主机

Content-Length

内容长度(字节),因为数据可能是二进制的,无法用某个字符来标志报文的结尾,所以直接告诉数据长度,来确认何时接受完毕

Content-Type
  • Text/html:html文本,用于浏览器 页面响应

  • Application/x-www-form-urlencoded 普通表单(纯文字表单),用encoded url方式 键=值&键=值,retrofit的@FormUrlEncoded注解就是这个

  • Multipart/form-data:多部分形式,一般用于传输包含二进制内容的多项内容,如文件.文字的混合传输,不同数据中间有长字符串分割(自动),retrofit的@Multipart

  • application/json:json形式

  • image/jpeg/application/zip …:单文件

  • Chunked Transfer Encoding

    分块传输

    服务端数据量太大或无法一次获取全部内容,导致所需数据无法一次准备完毕,需要等待很久可以使用,此时head中type标记为Transfer-Encoding:chunked

    此时是没有content-length的,因为无法确定切割长度

    此时的body格式

    <lenght1>
    <data1>
    <length2>
    <data2>
    0
    

    0为传输结束标志

Loacation

重定向的目标url

User-Agent

用户代理

可以获取发送请求浏览器类型,从而区分是手机访问还是电脑访问

Range/Accept-Range

指定body的内容范围

可以查看是否支持多段下载,用于断点续传,多线程下载等

相关header字段:range,content-range

发送Cookie/设置Cookie

Authorization

授权信息

Cache

对比失效时间(Last-Modified),对比指纹(Etag)等来确定是否使用缓存内容

REST

一套更规范的http使用范式