学好HTTP基础

193 阅读4分钟

HTTP定义

一种网络传输协议,位于Tcp/Ip协议族的应用层中,现在常用来在网络上进行资源传输。

HTTP工作方式

  1. 将资源信息拼装成请求报文并发送到服务器;
  2. 服务器收到请求后返回客户端响应报文;
  3. 客户端收到响应报文并进行处理;

两种报文

什么是报文

HTTP传输的数据块。

请求报文

从客户端发送的数据块叫做请求报文,请求报文有三个部分组成:请求行、请求头、请求体。
一个常见的POST请求报文如下:

POST /user/id HTTP/1.1
Host: api.github.com
Content-Type: application/json; charset=utf-8
Content-Length: 100
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) 
{"name":"xxx", "age":"18"}
  • 第一行叫做请求行:包括了请求的方法POST, 请求的路径 /user/id, HTTP的版本信息;
  • 请求行之后所有的键值对信息都被叫做请求头:Host: api.github.com、Content-Length: 100,当然请求头不只有这些;
  • 请求体:{"name":"xxx", "age":"18"},这里一般都是跟业务直接相关的数据,比如你要修改的用户信息;

响应报文

从服务器返回的数据块叫做响应报文,响应报文由三个部分组成:状态行、响应头、响应体。 一个常见的响应报文如下:

HTTP/1.1 200 OK
Host: api.github.com
Content-Type: application/json; charset=utf-8
Content-Length: 100
{"id":"0","name":"xxx", "age":"18"}
  • 第一行叫做状态行,包括了 HTTP的版本信息、状态码 200、状态信息 OK;
  • 状态行之后所有的键值对被叫做响应头,它和请求头的信息差不多;
  • 响应体:这里一般都是跟业务相关的数据,比如你想获取的用户信息;

HTTP常用的请求方法

有五种,分别是 GET、POST、PUT、DELETE、HEAD。

GET 方法

  • 用来获取资源
  • 不用来对服务器数据进行修改
  • 没有方法体
  • 具有幂等性,就是不管请求多少次,获取到的结果都是一样的。
GET /user/id HTTP/1.1
Host: api.github.com

POST 方法

  • 用来修改或增加服务器资源
  • 一般都有方法体,如用户更改数据就要将更改的数据传给服务器
POST /user/id HTTP/1.1
Host: api.github.com
{"name":"xxx", "age":"18"}

PUT 方法

用来修改服务器资源,这点和 POST 差不多,但是具有幂等性(就是多次请求的结果都一样),POST 具有增加的功能,所以多次请求的结果不一样,不具有幂等性。

PUT /user/id HTTP/1.1
Host: api.github.com
{"name":"xxx", "age":"18"}

DELETE 方法

用来删除资源,没有body,有幂等性。

DELETE /user/id HTTP/1.1
Host: api.github.com

HEAD 方法

获取信息,和 GET 使用一样,没有请求体,主要区别是这个HEAD发起的请求没有响应体,GET 发起的请求一般都会返回响应体。什么意思?简单来说就是如果你要用HEAD获取用户信息是获取不到的,但是 GET 可以。 所以这个 HEAD 使用来干嘛的?

  • 可以用来获取信息的大小,进行分段加载。
HEAD /user/id HTTP/1.1
Host: api.github.com
Content-Length: 20001

HTTP 中的 Headers

Headers的作用:作为HTTP消息的元数据(metadata,关于数据的数据)。

Host

服务器主机地址,如:Host: api.github.com。
作用:不是用来寻找IP地址的,而是用来DNS查询,就是用主机的域名来查找IP地址的行为。如果一个服务器主机有多个子主机就需要靠这个host来确定是那个子主机。

Content-Length

内容长度,就是Body的长度。
作用:用来判断内容结束。

Content-Type

内用类型,用来指定Body的类型,主要有四类:

  • text/html,用于浏览器响应网页的请求,响应Body中返回HTML文本。
  • application/x-www-form-urlencoded,普通表单的提交方式,用于请求体中,请求体的如下:name=xxx&age=19,如果数据包含&符号,会被编码,就像编码Url链接一样。
  • multipart/form-data,二进制文件的提交方式,如:上传图片。一般后面会跟着一个 boundary。
    • 什么是boundary:boundary 是一串复杂的字符串,用来区分 Body 有二进制文件时不同数据的分界线。如:上传用户信息时有用户的头像和姓名,这时 boundary 就被用来将 头像信息 和 姓名信息 区分开。
  • application/json,json格式响应,用于 Web Api的响应或者 POST/PUT 的请求。
  • image/jpeg | application/zip, 单文件,用于 Web Api的响应或者 POST/PUT 的请求。如:只上传头像。

状态码

对结果做出类型化的描述,如:成功、资源未找到。常用状态码如下:

  • 1xx:临时性消息
    • 100:继续发送
    • 101:正在切换协议
  • 2xx:成功
  • 3xx:资源重定向
    • 301:永久重定向,可以让浏览器做标记,旧网站的数据变成新网站的数据。
    • 302:暂时重定向
    • 304:内容未改变,
  • 4xx:客户端错误,请求有问题。
    • 401:未授权
    • 404:资源找不到
  • 5xx:服务器错误