http

请求

概述

http是基于 请求-响应 的方式完成通信的,每一次通信都是由客户端向服务端发出请求,传递一些消息过去,然后经过服务器处理程序处理后,响应给客户端一些消息。

http协议规定:

  1. 每次 请求-响应 都是独立的,相互之间互不干扰,这种模式的协议我们称之为 无状态协议
  2. 每次 请求-响应 传递的消息都是**纯文本(字符串)**,而且文本格式必须按照http协议规定的格式书写。

请求的消息格式

请求消息格式有三部分组成

请求行:高度概括了客户端想要干什么

请求头:描述了请求的一些额外信息

请求体:包含了要给服务器传递的正文数据。请求体是可以省略的

请求行

请求行是整个http报文的第一行字符串,它包含三个部分:请求方法 路径+参数+hash 协议和版本

重点关注的是请求方法

  • get获取资源
  • post提交消息
  • put修改数据
  • delete删除数据

其中getdelete请求不能有请求体,而postput请求可以有请求体

浏览器遵循了上面的规范,这带来了get和post的诸多区别。比如,由于get请求没有请求体,所以要传递数据只能把数据放到url的参数中

在浏览器中,获取数据一般使用的都是get请求,比如

  • 在地址栏输入地址并按下回车
  • 点击了某个a元素
  • 获取图片、音频、视频
  • 获取css、js、字体等文件

事实上、浏览器自动发出的请求基本都是get请求,而post请求需要开发者手动处理,比如在form表单中设置method为post

请求头header

请求头是一系列的键值对、里面包含了诸多和业务无关的信息

浏览器每次请求服务器都会自动附带很多请求头,其实这些请求头大部分服务器是不需要的

我们只需要关注下面几个请求头即可:

  1. Host:url地址中的主机

  2. User-Agent:客户端的信息描述

  3. Content-Type:请求的消息是什么格式,如果没有请求体,这个字段没有意义

    该字段的常见取值为:

    • application/x-www-form-urlencoded

      • 表示请求体的数据格式和url地址中参数的格式一样,比如 loginId=admin&loginPwd=123123
    • application/json

      • 表示请求体的数据是json格式{"loginId":"admin","loginPwd":"123123"}
    • mutipart/form-data

      • 一种特殊的请求体格式,上传文件一般选择该格式

请求体body

请求的主体内容

响应

响应的消息格式

服务器的响应格式包含三个部分

响应行

响应行是整个响应字符串的第一行

响应行包含两个部分

  • 协议版本:表示服务器打算和客户端用什么协议通信
  • 状态码、状态消息:表示服务器对当前请求的表态

通常状态码分为5类

分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务端错误,服务器在处理请求的过程中发生错误

通常认为,0-399之间的状态码都是正常的,其他是不正常的

常见的状态码有

  1. 200 ok 一切正常
  2. 301 Moved Permanently:资源已被永久重定向

你的请求我收到了,但是你要的东西已经不再这个地址上了,我已经永远的把它移动到了一个新的地址,麻烦你去请求新的地址,地址我放到请求头的Location里面了

  1. 302 Found:资源已被临时重定向

你的请求我收到了,但是你要的东西已经不再这个地址上了,我已经临时的把它移动到了一个新的地址,麻烦你去请求新的地址,地址我放到请求头的Location里面了

  1. 304 Not modified:文档内容未被修改。

你的请求我收到了,你要的东西跟之前是一样的,没有任何变化,所以我就不给你结果了,你自己就用以前的吧。啥?你没有缓存,那不关我的事。

  1. 400 Bad Request:语义有误,当前请求无法被服务器理解

盯又盯不懂,鞋又鞋不会

  1. 403 Forbidden:服务器拒绝执行

你的请求我收到了,但是我就是不给你东西

  1. 404 Not Found:资源不存在

你的请求我收到了,但是我没有你想要的东西

  1. 500 Internal Server Error:服务器内部错误

你的请求我已经收到了,但是这道题我不写,先睡了

响应头Header

和请求头一样,响应头也是由很多个键值对组成,具体有哪些键值对,完全取决于服务器程序,目前,对我们最重要的键值对是Content-type,他有多种取值,表示响应体的数据类型,在B/S模式中,浏览器会自动根据响应头中Content-type的取值,决定如何处理响应体

  1. text/plain:普通的纯文本,浏览器通常会将响应体原封不动的显示到页面上
  2. text/html:html文档,浏览器通常会将响应体作为页面进行渲染
  3. text/javascript或者application/javascript:js代码,浏览器通常会使用JS执行引擎将他解析执行
  4. text/css:css代码,浏览器会将它视为样式
  5. image/jpeg:浏览器会将它视为jpg图片
  6. attachment:附件,浏览器看到这个类型,通常会触发下载功能
  7. 其他MIME类型

响应体body

响应的主体内容

当一个在浏览器地址栏输入一个URL然后敲击回车,会发生什么?