6.7 HTTP协议概述

6.7.1 什么是HTTP协议?

<mark>HTTP是用于规定浏览器和服务器通信的方式</mark>。

<mark>规定</mark>两方面内容:

  • 浏览器向服务器发送的<mark>请求信息的格式</mark>,
  • 服务器向浏览器做出的<mark>响应信息的格式</mark>。

HTTP工作时遵循的基本原则

  • <mark>一次请求对应一次响应</mark>
  • <mark>请求只能由浏览器发起</mark>,服务器只能被动的等待请求,根据请求作出回应


6.8 HTTP协议详解

6.8.1 HTTP - 请求

1、请求行 - GET .... HTTP/1.1

GET /news/hello.html HTTP/1.1

  • GET
    提交方式,在HTTP协议中一共规定了7种提交方式,其中5种都不常用,只用GET和POST。

  • /news/hello.html
    请求的资源路径,用于通知服务器浏览器访问的是服务器中哪个Web应用以及应用下的哪一个资源文件。

  • HTTP/1.1
    请求所遵循的协议和版本

2、若干请求头/若干请求报头

请求头 - 浏览器发送给服务器,为了让服务器更好解析请求,比处理请求。

请求头都是Key-Value结构,
例如:

  • Host : localhost – 表示浏览器请求的是服务器中的<mark>哪一台虚拟主机</mark>。
  • Cookie : xxx=xxx; ( <mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{重点} ) – <mark>cookie技术中的一个头</mark>(后面讲)
  • xxx : xxx

3、请求实体内容

  • 如果请求方式是GET提交,请求实体不会有内容。
  • 如果请求方式是POST提交,并且请求中携带了数据,请求实体才会有内容

6.8.2 HTTP - 响应

1、状态行

HTTP/1.1 200 OK

  • HTTP/1.1:<mark>表示响应信息所遵循的协议和版本</mark>
  • 200:是一个三位是数字,叫做<mark>状态码</mark>,表示请求处理的结果。

常见的状态码有:

  • 200:表示服务器处理请求的结果是<mark>成功</mark>的!
  • 304/307:表示服务器通知浏览器<mark>使用缓存</mark>
  • 400:表示请求<mark>参数类型不匹配</mark>
  • 404:表示客户端请求的<mark>资源不存在</mark>
  • 500:表示服务器端在处理<mark>请求</mark>的过程中出现了错误或<mark>异常</mark>
  • OK:<mark>描述短语</mark>,也表示请求处理的结果

常见描述语

  • 200 OK
  • 404 NOT FOUND
  • 500 Internal Server Error

2、若干响应头

响应头的格式也是Key-Value结构:

  • Content-Type: text/html – 通知浏览器,服务器响应的数据类型是什么
    • text/html – 表示服务器响应是一个html格式的网页,如果响应是一个网页,还可以在值的后面加上一个编码,例如: text/html;charset=utf-8
    • text/css – 表示服务器响应是一个css文件
    • image/gif – 表示服务器响应的是一个gif格式的图片
    • ...
  • Content-Length: 服务器响应的数据长度,单位是字节
  • Set-Cookie: <mark>Cookie技术中的一个头</mark>(后面讲解)
  • Refuresh: 5 ; url=http://www.baidu.com/index.html : 自动转跳…(如:下载时)
  • ...

3、响应实体内容

如果浏览器向服务器请求的是一个文件,服务器会将这个文件的内容作为响应实体发送给浏览器。

比如:
浏览器请求是 hello.html文件,
服务器就会将hello.html文件的内容作为响应实体发送给浏览器
localhost/news/hello.html,

HTTP总结:

  • <mark>HTTP</mark>: 用于规定浏览器和服务器之间<mark>通信的方式</mark>
  • <mark>请求信息</mark>中包含哪几部分内容:
    • 请求行、
    • 请求报头、
    • 请求实体
  • <mark>响应信息</mark>中包含哪几部分内容:
    • 状态行、
    • 响应报头、
    • 响应实体
  • <mark>请求行</mark>中包含什么内容:
    • 请求方式、
    • 请求资源路径、
    • 协议和版本
  • <mark>状态行</mark>中包含什么内容:
    • 协议和版本、
    • 状态码、
    • 描述短语

6.8.3 内容补充

问题1:请求方式什么时候是GET提交?什么时候是POST提交?

只有使用表单(<form>),并且再表单上明确的通过 method 指定提交方式为 POST 时,才是 POST 提交。
其他方式都是 GET 提交(AJAX除外)


例子
判断以下请求方式是GET还是POST?

(1)<form action="#"></form>				-- GET提交

(2)<form action="#" method="GET"></form>	-- GET提交

(3)<form action="#" method="POST"></form>	-- POST提交

(4)点击超链接访问服务器,例如:				-- GET提交
<a href="http://www.baidu.com">百度一下</a>

(5)直接在浏览器的地址栏中书写URL地址访问服务器	-- GET提交

问题2:GET提交和POST提交有什么区别?

GET提交:

  • 会将请求参数<mark>拼接在URL地址的后面</mark>,<mark>显示在地址栏中</mark>,<mark>相对不安全</mark>
  • 将参数显示在地址栏中,<mark>数据量不能太大</mark>,不能超过1K或者是4K

POST 提交:

  • 不会将参数拼接在地址栏后面, 而是通过请求实体将参数发送给服务器, <mark>相对来说更加安全</mark>!
  • 通过请求实体传数据给服务器, <mark>数据量理论上没有限制</mark>!

当向服务器<mark>传输大量</mark>的数据或者传输的数据较为<mark>隐私</mark>,<mark>才会使用POST提交</mark>。
<mark>更多情况下,还是使用GET提交</mark>!!