HTTP 协议
HTTP 简介
HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP 协议工作于客户端-服务端架构(C/S)上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。
Web 服务器有:Apache 服务器,IIS 服务器(Internet Information Services)等。
HTTP 默认端口号为 80,但是你也可以改为 8080 (代理服务器)或者其他端口。
HTTP 消息结构
客户端请求消息(请求头)
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,如下图:
1、请求行
请求行由请求方法字段、URL 字段和 HTTP 协议版本字段 3 个字段组成,它们用空格分隔。比如:
GET /data/info.html HTTP/1.1
- 方法字段就是 HTTP 使用的请求方法,比如常见的 GET/POST/HEAD。HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- URL 统一资源定位符
- HTTP 协议版本有两种:HTTP1.0/HTTP1.1。
2、请求头部
大多数请求头并不是必需的,但 Content-Length 除外。对于 POST (向服务器提交数据)请求来说 Content-Length 必须出现。
常见的有:
- Host:客户机通过这个头告诉服务器,想访问的主机名。Host 头域指定请求资源的 Intenet 主机和端口号,必须表示请求 url 的原始服务器或网关的位置。HTTP/1.1 请求必须包含主机头域,否则系统会以 400 状态码返回。
- User-Agent:User-Agent 头域的内容包含发出请求的用户信息。浏览器类型,如果 Servlet 返回的内容与浏览器类型有关则该值非常有用。
- Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
更多请求头字段参考HTTP头字段。
3、空行
通过一个空行,告诉服务器请求头部到此为止,以下是请求数据。
4、请求数据
- 若方法字段是 GET,则此项为空,没有数据。
- 若方法字段是 POST,则通常来说此处放置的就是要提交的数据。表单数据包含在这部分。
服务器响应消息(响应头)
HTTP 响应也由四个部分组成,分别是:响应行、响应头、空行和响应体。
1、响应行
响应行一般由协议版本、状态码及其描述组成 比如:
HTTP/1.1 200 OK
其中协议版本 HTTP/1.1 或者 HTTP/1.0,200就是它的状态码(关于状态码见下文),OK 则为它的描述。
2、响应头
响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。根据响应行的状态码,响应头会有不同的字段。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个 Location 头,而 401(Unauthorized) 状态代码则必须伴随一个 WWW-Authenticate 头。
常见的响应头字段:
- Allow:服务器支持哪些请求方法(如GET、POST等)
- Date:当前的GMT时间
- Server:服务器通过这个头告诉浏览器服务器的类型
更多响应头字段请参考HTTP头字段。
3、空行
通过一个空行,告诉服务器请求头部到此为止,以下内容是响应体。
4、响应体
响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是 HTML 页面,那么返回的就是 HTML 代码,如果是 JS 就是 JS 代码。
通用头(General)、实体头
详见通用头、实体头。
状态码
状态码分类
- 1**:信息,服务器收到请求,需要请求者继续执行操作
- 2**:成功,操作被成功接收并处理
- 3**:重定向,需要进一步的操作以完成请求
- 4**:客户端错误,请求包含语法错误或无法完成请求
- 5**:服务器错误,服务器在处理请求的过程中发生了错误
常见状态码
- 200 - 请求成功。
- 301 - 资源(网页等)被永久转移到其它 URL。
- 304 - 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。
- 400 - 客户端请求的语法错误,服务器无法理解。
- 401 - 未授权。请求要求用户的身份认证。
- 404 - 请求的资源(网页等)不存在。
- 500 - 内部服务器错误。
- 502 - 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。
- 更多 - 参考HTTP状态码
区分 GET/POST
1、提交数据的形式
- GET 请求的数据会附在 URL 之后,会直接展现在地址栏中。
- POST 方法则会把数据放到请求数据字段中以 & 分隔各个字段,请求行不包含数据参数,地址栏也不会额外附带参数
2、提交数据的安全
- POST 比 GET 方式的安全性要高
- 通过GET提交数据,用户名和密码将明文出现在URL上,如:
- 登录页面有可能被浏览器缓存
- 其他人查看浏览器的历史纪录
- 跨站攻击