Skip to content

HTTP协议

HTTP协议是HyperText Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。

HTTP协议和html前面的ht都是超文本的意思,所以HTTP与html是配合非常紧密的一对,我们可以认为HTTP就是为了传输html这样的文件,HTTP位于应用层,侧重于解释.

HTTP协议对消息区分可以分为请求消息和响应消息。

请求消息

我们要开发的服务器与浏览器通信采用的就是HTTP协议,在浏览器想访问一个资源的时候,在浏览器输入访问地址(例如http://127.0.0.1:8000),地址输入完成后当敲击回车键的时候,浏览器就将请求消息发送给服务器

我们可以先用测试工具创建一个socket服务器

之后通过浏览器请求地址,就会看到浏览器发送过来的请求消息

这个消息看起来很乱很复杂,对应的就是我们说的请求消息.

请求消息分为四部分内容:

  1. 请求行 说明请求类型,要访问的资源,以及使用的HTTP版本
  2. 请求头 说明服务器使用的附加信息,都是键值对,比如表明浏览器类型
  3. 空行 不能省略-而且是\r\n,包括请求行和请求头都是以\r\n结尾
  4. 请求数据 表明请求的特定数据内容,可以省略-如登陆时,会将用户名和密码内容作为请求数据

请求类型

HTTP协议有很多种请求类型,对我们来说常见的用的最多的是get和post请求。常见的请求类型如下:

  1. Get 请求指定的页面信息,并返回实体主体
  2. Post 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  3. Head 类似于get请求,但是响应消息没有内容,只是获得报头
  4. Put 从客户端向浏览器传送的数据取代指定的文档内容
  5. Delete 请求服务器删除指定的页面
  6. Connect HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
  7. Options 允许客户端查看浏览器的性能
  8. Trace 回显服务器收到的请求,主要用于测试和诊断

get 和 post 请求都是请求资源,而且都会提交数据,如果提交密码信息用get请求,就会明文显示,而post则不会显示出涉密信息.

响应消息

响应消息是代表服务器收到请求消息后,给浏览器做的反馈,所以响应消息是服务器发送给浏览器的,响应消息也分为四部分:

  1. 状态行 包括HTTP版本号,状态码,状态信息
  2. 消息报头 说明客户端要使用的一些附加信息,也是键值对
  3. 空行 \r\n 同样不能省略
  4. 响应正文 服务器返回给客户端的文本信息

示例:

常见状态码

HTTP状态码由三位数字组成,第一个数字代表响应的类别,有五种分类:

  1. 1xx 指示信息--表示请求已接收,继续处理
  2. 2xx 成功--表示请求已被成功接收、理解、接受
  3. 3xx 重定向--要完成请求必须进行更进一步的操作
  4. 4xx 客户端错误--请求有语法错误或请求无法实现
  5. 5xx 服务器端错误--服务器未能实现合法的请求

常见的状态码如下:

  • 200 OK 客户端请求成功
  • 301 Moved Permanently 重定向
  • 400 Bad Request 客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
  • 403 Forbidden 服务器收到请求,但是拒绝提供服务
  • 404 Not Found 请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error 服务器发生不可预期的错误
  • 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

常见文件类型分类

HTTP与浏览器交互时,为使浏览器能够识别文件信息,所以需要传递文件类型,这也是响应消息必填项,常见的类型如下:

  • 普通文件: text/plain; charset=utf-8
  • *.html: text/html; charset=utf-8
  • *.jpg: image/jpeg
  • *.gif: image/gif
  • *.png: image/png
  • *.wav: audio/wav
  • *.avi: video/x-msvideo
  • *.mov: video/quicktime
  • *.mp3: audio/mpeg

特别说明

  • charset=iso-8859-1 西欧的编码,说明网站采用的编码是英文;
  • charset=gb2312 说明网站采用的编码是简体中文;
  • charset=utf-8 代表世界通用的语言编码;可以用到中文、韩文、日文等世界上所有语言编码上
  • charset=euc-kr 说明网站采用的编码是韩文;
  • charset=big5 说明网站采用的编码是繁体中文;

RESTful

通常被称为 REST(Representational State Transfer),是一种软件架构风格,用于设计网络应用程序。它基于HTTP协议,并遵循一组设计原则和约束,以实现可伸缩的、灵活的网络服务。

REST 的设计理念是:

  1. 资源:网络上的每个实体都是一个资源。资源可以是一个文档、一个人、一个事件等。
  2. 表现形式(Representations):资源的某个具体状态可以通过不同的表现形式来表示。例如,一个人的资源可以通过文本、图片或其他任何形式来表示。
  3. 状态转移(State Transfer):客户端通过发送请求到服务端,请求可能会改变服务端的状态(例如,创建新的资源,更新资源状态,读取资源状态等)。

RESTful 应用程序的典型特征包括:

  • 使用 HTTP方法(如GET、POST、PUT、DELETE)来操作数据。
  • 通过 URL(统一资源定位符)来表示资源的地址。
  • 使用 标准数据格式(如JSON或XML)来描述资源的表现形式。
  • 分离 客户端和服务器端状态,以便每个请求可以独立完成操作。
  • 无状态的设计,每次请求都包含必要的信息,不依赖于之前的请求(这有助于实现高可伸缩性)。
  • 超媒体作为自描述的指南,在响应中包含链接,以此作为导航的指南。

RESTful 设计原则通常用于创建现代网络上通信的 Web 服务和 API。由于其无状态性和分层架构,RESTful API 适合处理高并发请求,并且可以通过缓存和代理来改善性能和扩展性。