三、form表单 和 文件上传
(一)form表单
1、表单的作用:采集数据
2、表单的三个组成部分:表单标签、表单域、表单按钮
(1)表单标签:HTML的<form>就是表单标签,它是一个“容器”,用来将页面上指定的区域划定为表单区域:
(2)表单域:表单域提供了采集用户信息的渠道,常见的表单域有: input 、textarea 、 select 等
(3)表单按钮:当表单数据填写完毕后,用户点击表单按钮,还会触发表单的提交操作,从而把采集到的数据提交给服务器
3、把表单采集到的数据提交给服务器时,需要指定请求的方式与请求的URL地址
4、<form>标签的属性一览表
<form>标签最重要的3个属性分别是 action、method、enctype
| 属性 | 可选值 | 说明 |
|---|---|---|
| action | 接口的url地址 | 把表单采集到的数据,提交到哪个接口中 |
| method | get 或 post | 数据的提交方式(默认值为get) |
| enctype | application/x-www-form-urlencoded multipart/form-data | 数据的编码格式。具体指的是: 把表单数据提交给服务器之前,如何对将要提交的数据进行编码(默认值 application/x-www-form-urlencoded) |
注意:enctype 属性只能搭配 post 提交方式一起使用;如果是get 提交,则enctype 没有意义!
5、以 GET 方式提交表单数据
在<form>标签上,通过action属性指定提交的URL地址,通过method属性指定提交的方式为GET:
注意:由于method 属性的默认值就是GET,因此上述的 method="GET" 可以被省略
6、以POST方式提交表单数据
在<form>标签上,通过action属性指定提交的URL地址,通过method属性指定提交的方式为POST,并通过enctype属性指定数据的编码方式为 application/x-www-form-urlencoded
注意:由于enctype的默认值就是 application/x-www-form-urlencoded ,因此上述的 enctype 可以被省略
7、表单提交的问题
1)产生问题的原因:<form>表单身兼数职:既负责采集数据,又负责吧数据提交到服务器,表单的默认提交行为会导致页面的跳转
2)解决方案:
-
<form>表单只负责采集数据
-
Ajax负责将数据提交到服务器。(符合:职能单一的原则)
8、通过Ajax提交表单数据
作用:通过Ajax提交表单采集到的数据,可以防止表单的默认提交行为导致的页面跳转问题,提到用户的体验。
① 监听表单的 submit 提交事件
② 阻止默认提交行为
③ 基于 axios 发起请求
④ 指定请求方式、请求地址
⑤ 指定请求体数据
9、jQuery的 serialize( )函数
jQuery 的 serialize( ) 函数能够一次性获取到表单中采集的数据,它的语法格式如下:$('表单元素的选择器').serialize
10、serialize( )函数的使用注意点
在使用serialize( )函数快速获取表单数据时,必须为每个表单域添加 name 属性
11、serialize( )函数的其他特点
1)该方法是jQuery封装的,使用时必须引入jQuery 2)使用serialize(),各表单域必须有 name 属性 3)使用该方法得到的结果是一个查询字符串结构:name=value&name=value 4)该方法 能够 获取 隐藏域的值 5)该方法不能得到禁用状态的值 6)该方法不能得到文件域中的文件信息,所以不能完成文件上传
(二)axios请求方式的别名
1、常用的5种请求方式:GET、POST、PUT、PATCH、DELETE
1) axios.get(url[, config])
2) axios.delete(url[, config])
3) axios.post(url[, data[, config]])
4) axios.put(url[, data[, config]])
5) axios.patch(url[, data[, config]])
2、简化方法的参数
3、 axios.get( )的用法
4、 axios.( )的用法
(三)axios全局配置 和 拦截器
1、全局配置请求根路径
1)在 url 地址中,协议://域名:端口 对应的部分叫做“请求根路径”。
2)全局配置请求根路径的好处:
-
① 提高项目的可维护性。全局配置根路径后,后续所有的请求都可以使用全局配置的根路径 假设:端口号从 3009 变成了 3006
-
② 没有全局配置根路径,则每个请求的URL中的端口号都需要被修改!
-
③ 有全局配置根路径,则只需要修改全局配置即可
3)全局配置请求根路径 - - 语法格式
2、拦截器:
1)拦截器
-
① 拦截器(interceptors)用来全局拦截 axios 的 每一次请求与响应。
-
② 好处:可以把每个请求中,某些 重复性的业务代码封装到拦截器中,提高代码的复用性
2)不使用拦截器 - 实现 loading 效果
3)使用拦截器 - 实现 loading 效果
- ① 在请求拦截器中展示 loading 效果:
- ②在响应拦截器中隐藏 loading 效果:
(四)FormData和文件上传
1、FormData介绍
1)FormData 是一个浏览器对象。用于管理表单数据。
2)IE10+支持。
3)可以这样理解,FormData的作用和 jQuery中的 serialize() 作用一样,用于快速收集表单数据
4)并且可以将创建的FormData对象直接提交给接口。
5)典型应用场景:FormData + Ajax 技术实现文件上传的功能。
2、FormData基本使用方法
① 假设需要收集 <form>……</form> 里面的所有表单项的值
② 要求,每个表单元素都具有 name 属性
注意事项:提交FormData 对象,不能使用GET方式,具体以接口文档为准
3、FormData的API方法
在提交数据前,可以使用下列API方法对数据进行查看和修改
4、FormData 和 serialize的区别
① 共同点:
-
都需要设置表单各项的name属性。
-
都能快速收集表单数据
-
都能够获取到隐藏域(<input type="hidden" />)的值
-
都不能获取禁用状态(disabled)的值
②不同点:
-
FormData属于原生的代码;serialiaze是jQuery封装的方法
-
FormData可以收集文件域(<input type="file"/>)的值,而serialize不能。如果有文件上传,则必须使用FormData。
-
得到的结果的数据类型不一样(知道即可)
(五)文件域补充
1、文件域:<input type="file" />
1)accept属性:控制能够选择的文件类型,比如 accept="image/png,image/jpeg"
2)multiple 属性:控制是否可以多选文件
2、文件对象
1) 面向对象中,讲过,JS中表示一个人,需要用到对象。
2)JS中表示一个文件,也需要用对象,也就是文件对象
3)文件对象,是本地文件的一个表示。
4) 通俗的说,在 JavaScript 中,使用 文件对象 表示一个本地文件。
5) 文件对象不需要自己创建,可以通过文件域获取得到
-
选择一个或多个文件
-
根据文件域,找到它的 files 属性。files属性是一个伪数组,里面包含了一个或多个文件对象。
6)取得文件对象
3、文件对象的作用之一
1)本地预览
4、文件对象的作用之二
1)追加到FormData,实现文件上传
(六)请求报文 & 响应报文
1、什么是请求报文和响应报文
客户端与服务器通信的过程是基于请求与响应的:
-
请求报文规定了客户端以什么格式把数据发送给服务器
-
响应报文规定了服务器以什么格式吧数据响应给客户端
2、请求报文—格式
1)请求报文由请求行(request line)、请求头部( header )、空行 和 请求体 4 个部分组成。图示如下:
2)注意:
-
在浏览器中,GET 请求比较特殊,它只有请求头,没有请求体。
-
在浏览器中,POST、PUT、PATCH、DELETE 请求既有请求头,又有请求体。
3、响应报文—格式
1)响应报文由状态行、响应头部、空行 和 响应体 4 个部分组成。图示如下:
4、URL参数
1)常用的5种请求方式,都可以在URL后面携带请求参数。
2)由于URL的长度有限制,所以请求参数一般都比较小,比如不能做文件上传
3)常用的请求参数有两种写法
- /api/xxx? ?参数=值&参数=值 (这种格式的字符串叫做查询字符串,所以这样的参数叫做查询参数)
- /api/xxx/值/值 (Restful 风格的接口用这种格式的参数)
5、请求体
1)除URL请求以外,其他4种常用的请求方式,都可以设置请求体
2)请求体的大小没有限制,所以可以提交大量的数据
3)常用的请求体格式有以下三种
-
参数=值&参数=值 (查询字符串格式)
-
'{"id"=1,"name":"张三"}' (JSON格式)
-
new ForData( ) (FormData对象格式)
4)axios中,如何设置不同格式的请求体
-
第一种格式:参数=值&参数=值
// axios.post的第二个参数,直接用查询字符串 axios.post('/api/xxx', 'key=value&key=value') -
第二种格式:'{"id"=1,"name":"zs"}'
// axios.post的第二个参数,使用对象。axios会将它转成JSON格式 axios.post('/api/xxx', { id: 1, name: 'zs' }) -
第三种格式: new ForData( )
let fd = new FormData(); // axios.post的第二个参数,直接使用 FormData 对象 axios.post('/api/formdata', fd)
5)请求的时候,设置了不同格式的请求体,需要一个对应的请求头
-
第一种格式参数=值&参数=值 (查询字符串格式)
Content-Type: application/x-www-form-urlencoded -
'{"id"=1,"name":"张三"}' (JSON格式)
Content-Type: application/json -
new ForData( ) (FormData对象格式)
Content-Type: multipart/form-data; xxsd随机字符
6、http响应状态码
1)概念:http响应状态码(Status Code)由三位数字组成,用来标识响应成功与否的状态
2)作用:客户端浏览器根据响应状态码,即可判断出这次http请求是否成功。
7、常见的http响应状态码
| 状态码 | 状态码描述 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 资源在服务器端已成功创建 |
| 304 | Not Modified | 资源在客户端被缓存,响应体中不包含任何资源内容 |
| 400 | Bod Request | 客户端的请求方式或请求参数有误导致的请求失败 |
| 401 | Unauthorized | 客户端的用户身份认证未通过,导致此次请求失败 |
| 404 | Not Found | 客户端请求的资源地址错误。导致服务器无法找到资源 |
| 500 | Internal Server Error | 服务器内部错误,导致的本次请求失败 |
8、http响应状态码 Vs 业务状态码
1)所处的位置不同
- 在响应头的状态行中所包含的状态码,或者请求列表中的Status,叫做“响应状态码”
- 在响应体的数据中包含的状态码(案例中叫做code),叫做“业务状态码”
2)表示的结果不同
-
响应状态码只能表示这次请求的成功与否
-
业务状态码用来表示这次业务处理的成功与否
3)通用性不同
- 响应状态码是由http协议规定的,具有通用性。每个不同的状态码都有其标准的含义,不能乱用
- 业务状态码是后端程序员自定义的,不具有通用性