umi request 请求资源库详解
umi-request:
网络请求库,基于fetch封装,兼具fetch 和 axios 的所有特点,具有缓存,超时,字符编码处理,错误处理等常用功能。
1 支持url 参数自动序列化。
2 post 数据提交方式简化。
3 api超时支持。
4 api请求缓存支持。
5 支持处理gbk.(gbk 一种字符集)。
6 类axios的request和response拦截器(interceptors)支持。
7 统一的错误处理方式。
8 类koa洋葱机制的use中间件机制支持。
9 类axios的取消处理。(cancel Token).
10 支持Node环境发送http请求。
相较于fetch和axios 而言具有更多的功能,支持取消请求,中间件,超时 ,缓存等功能。
上手的基本示例:
首先,执行get 请求:
1 import request from 'umi-request';
2
3 request
4 .get('/api/v1/xxx?id=1')
5 .then(function(response) {
6 console.log(response);
7 })
8 .catch(function(error) {
9 console.log(error);
10 });
同时,也可将请求的url参数放在options,params中:
1 request.get('/api/v1/xxx', {
2 params: {
3 id: 1,
4 },
5 })
6 .then(function(response) {
7 console.log(response);
8 })
9 .catch(function(error) {
10 console.log(error);
11 });
执行基本的post请求:
1 request
2 .post('/api/v1/user', {
3 data: {
4 name: 'Mike',
5 },
6 })
7 .then(function(response) {
8 console.log(response);
9 })
10 .catch(function(error) {
11 console.log(error);
12 });
umi-request的相关API:
可以通过向 umi-request 传参来发起请求,在method中指定请求方式。
umi-request(url[, options]):
示例:
1 import request from 'umi-request';
2
3 request('/api/v1/xxx', {
4 method: 'get',
5 params: { id: 1 },
6 })
7 .then(function(response) {
8 console.log(response);
9 })
10 .catch(function(error) {
11 console.log(error);
12 });
13
14 request('/api/v1/user', {
15 method: 'post',
16 data: {
17 name: 'Mike',
18 },
19 })
20 .then(function(response) {
21 console.log(response);
22 })
23 .catch(function(error) {
24 console.log(error);
25 });
相关请求方法的别名,之后可以不用单独在method中配置请求方式。
request.get(url[, options]) request.post(url[, options]) request.delete(url[, options]) request.put(url[, options]) request.patch(url[, options]) request.head(url[, options]) request.options(url[, options])
如果有些配置多个请求当中都有使用到,则可以通过extend创建一个umi-request实例,将公共的配置放置在实例中。则可以实现配置的简化:extend([options])
示例:
1 import { extend } from 'umi-request';
2
3 const request = extend({
4 prefix: '/api/v1',
5 timeout: 1000,
6 headers: {
7 'Content-Type': 'multipart/form-data',
8 },
9 });
之后这个get请求便可以使用extend中的公共配置。
1 request
2 .get('/user')
3 .then(function(response) {
4 console.log(response);
5 })
6 .catch(function(error) {
7 console.log(error);
8 });
其他的请求方式同理。例如:post delete put patch head options 等。
请求参数的配置:request options 中的参数详情:
extend options的参数支持以上的所有参数。
参数含义详情:
1 {
2 // 'method' 是创建请求时使用的方法
3 method: 'get', // default
4
5 // 'params' 是即将于请求一起发送的 URL 参数,参数会自动 encode 后添加到 URL 中
6 // 类型需为 Object 对象或者 URLSearchParams 对象
7 params: { id: 1 },
8
9 // 'paramsSerializer' 开发者可通过该函数对 params 做序列化(注意:此时传入的 params 为合并了 extends 中 params 参数的对象,如果传入的是 URLSearchParams 对象会转化为 Object 对象
10 paramsSerializer: function (params) {
11 return Qs.stringify(params, { arrayFormat: 'brackets' })
12 },
13
14 // 'data' 作为请求主体被发送的数据
15 // 适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
16 // 必须是以下类型之一:
17 // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
18 // - 浏览器专属:FormData, File, Blob
19 // - Node 专属: Stream
20 data: { name: 'Mike' },
21
22 // 'headers' 请求头
23 headers: { 'Content-Type': 'multipart/form-data' },
24
25 // 'timeout' 指定请求超时的毫秒数(0 表示无超时时间)
26 // 如果请求超过了 'timeout' 时间,请求将被中断并抛出请求异常
27 timeout: 1000,
28
29 // ’prefix‘ 前缀,统一设置 url 前缀
30 // ( e.g. request('/user/save', { prefix: '/api/v1' }) => request('/api/v1/user/save') )
31 prefix: '',
32
33 // ’suffix‘ 后缀,统一设置 url 后缀
34 // ( e.g. request('/api/v1/user/save', { suffix: '.json'}) => request('/api/v1/user/save.json') )
35 suffix: '',
36
37 // 'credentials' 发送带凭据的请求
38 // 为了让浏览器发送包含凭据的请求(即使是跨域源),需要设置 credentials: 'include'
39 // 如果只想在请求URL与调用脚本位于同一起源处时发送凭据,请添加credentials: 'same-origin'
40 // 要改为确保浏览器不在请求中包含凭据,请使用credentials: 'omit'
41 credentials: 'same-origin', // default
42
43 // ’useCache‘ 是否使用缓存,当值为 true 时,GET 请求在 ttl 毫秒内将被缓存,缓存策略唯一 key 为 url + params + method 组合
44 useCache: false, // default
45
46 // ’ttl‘ 缓存时长(毫秒), 0 为不过期
47 ttl: 60000,
48
49 // 'maxCache' 最大缓存数, 0 为无限制
50 maxCache: 0,
51
52 // 根据协议规范, GET 请求用于获取、查询服务端数据,在数据更新频率不频繁的情况下做必要的缓存能减少服务端的压力,因为缓存策略是默认对 GET 请求做缓存,但对于一些特殊场景需要缓存其他类型请求的响应数据时,我们提供 validateCache 供用户自定义何时需要进行缓存, key 依旧为 url + params + method
53 validateCache: (url, options) => { return options.method.toLowerCase() === 'get' },
54
55 // 'requestType' 当 data 为对象或者数组时, umi-request 会根据 requestType 动态添加 headers 和设置 body(可传入 headers 覆盖 Accept 和 Content-Type 头部属性):
56 // 1. requestType === 'json' 时, (默认为 json )
57 // options.headers = {
58 // Accept: 'application/json',
59 // 'Content-Type': 'application/json;charset=UTF-8',
60 // ...options.headers,
61 // }
62 // options.body = JSON.stringify(data)
63 // 2. requestType === 'form' 时,
64 // options.headers = {
65 // Accept: 'application/json',
66 // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
67 // ...options.headers,
68 // };
69 // options.body = query-string.stringify(data);
70 // 3. 其他 requestType
71 // options.headers = {
72 // Accept: 'application/json',
73 // ...options.headers,
74 // };
75 // options.body = data;
76 requestType: 'json', // default
77
78 // ’parseResponse‘ 是否对请求返回的 Response 对象做格式、状态码解析
79 parseResponse: true, // default
80
81 // ’charset‘ 当服务端返回的数据编码类型为 gbk 时可使用该参数,umi-request 会按 gbk 编码做解析,避免得到乱码, 默认为 utf8
82 // 当 parseResponse 值为 false 时该参数无效
83 charset: 'gbk',
84
85 // 'responseType': 如何解析返回的数据,当 parseResponse 值为 false 时该参数无效
86 // 默认为 'json', 对返回结果进行 Response.text().then( d => JSON.parse(d) ) 解析
87 // 其他(text, blob, arrayBuffer, formData), 做 Response[responseType]() 解析
88 responseType: 'json', // default
89
90 // 'throwErrIfParseFail': 当 responseType 为 json 但 JSON.parse(data) fail 时,是否抛出异常。默认不抛出异常而返回 Response.text() 后的结果,如需要抛出异常,可设置 throwErrIfParseFail 为 true
91 throwErrIfParseFail: false, // default
92
93 // 'getResponse': 是否获取源 Response, 返回结果将包含一层: { data, response }
94 getResponse: false,// default
95
96 // 'errorHandler' 统一的异常处理,供开发者对请求发生的异常做统一处理,详细使用请参考下方的错误处理文档
97 errorHandler: function(error) { /* 异常处理 */ },
98
99 // 'cancelToken' 取消请求的 Token,详细使用请参考下方取消请求文档
100 cancelToken: null,
101 }
实例化请求实例之后,若还需要动态更新参数,umi-request中的extendOptions方法供用户进行更新。
const request = extend({ timeout: 1000, params: { a: '1' } });
// 默认参数是 { timeout: 1000, params: { a: '1' }} request.extendOptions({ timeout: 3000, params: { b: '2' } });
// 此时默认参数是 { timeout: 3000, params: { a: '1', b: '2' }}
响应结构:
响应对象Response如下:
1 {
2 // `data` 由服务器提供的响应, 需要进行解析才能获取
3 data: {},
4
5 // `status` 来自服务器响应的 HTTP 状态码
6 status: 200,
7
8 // `statusText` 来自服务器响应的 HTTP 状态信息
9 statusText: 'OK',
10
11 // `headers` 服务器响应的头
12 headers: {},
13 }
当 options.getResponse === false 时, 响应结构为解析后的 data:
request.get('/api/v1/xxx', { getResponse: false }).then(function(data) {
console.log(data);
});
当 options.getResponse === true 时,响应结构为包含 data 和 Response 的对象:
request.get('/api/v1/xxx', { getResponse: true }).then(function({ data, response }) {
console.log(data);
console.log(response.status);
console.log(response.statusText);
console.log(response.headers);
});
错误处理:
1 import request, { extend } from 'umi-request';
2
3 const errorHandler = function(error) {
4 const codeMap = {
5 '021': '发生错误啦',
6 '022': '发生大大大大错误啦',
7 // ....
8 };
9 if (error.response) {
10 // 请求已发送但服务端返回状态码非 2xx 的响应
11 console.log(error.response.status);
12 console.log(error.response.headers);
13 console.log(error.data);
14 console.log(error.request);
15 console.log(codeMap[error.data.status]);
16 } else {
17 // 请求初始化时出错或者没有响应返回的异常
18 console.log(error.message);
19 }
20
21 throw error; // 如果throw. 错误将继续抛出.
22
23 // 如果return, 则将值作为返回. 'return;' 相当于return undefined, 在处理结果时判断response是否有值即可.
24 // return {some: 'data'};
25 };
26
27 // 1. 作为统一错误处理
28 const extendRequest = extend({ errorHandler });
29
30 // 2. 单独特殊处理, 如果配置了统一处理, 但某个api需要特殊处理. 则在请求时, 将errorHandler作为参数传入.
31 request('/api/v1/xxx', { errorHandler });
32
33 // 3. 通过 Promise.catch 做错误处理
34 request('/api/v1/xxx')
35 .then(function(response) {
36 console.log(response);
37 })
38 .catch(function(error) {
39 return errorHandler(error);
40 });
中间件机制,详情请转至:https://github.com/umijs/umi-request/blob/master/README_zh-CN.md
umi request 请求资源库详解的更多相关文章
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- 在ASP.NET 5应用程序中的跨域请求功能详解
在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...
- Spring RestController 请求参数详解
Spring RestController 请求参数详解 引用作者jpfss 在阅读之前,最好先了解http请求的get,post,以及各种head头类型,请求参数类型. 无参数,设置RestCont ...
- Servlet技术——request、respone详解
Servlet之request.respone详解 Request (一) 概述 request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个reque ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解
AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...
- JS JSOP跨域请求实例详解
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...
- Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...
- Spring— 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...
- springMVC请求流程详解
SpringMVC框架是一个基于请求驱动的Web框架,并且使用了'前端控制器'模型来进行设计,再根据'请求映射规则'分发给相应的页面控制器进行处理. (一)整体流程 具体步骤: 1. 首先用户发送请 ...
随机推荐
- Linux 基础学习篇笔记 Linux基础知识
哎呀,翻到第一篇,映出眼帘的标题:从Unix到Linux(我就知道学习不能急,不能像我,看个简介,就赶忙去查了,原来作者在这里给出详细的介绍了) 1.1根据书上写的,原来linux的内核是被Linus ...
- JavaSE-基础语法
注释 单行注释: //注释 多行注释: /*注释*/ 文档注释: /** 文档注释 */ 标识符与关键字 下图为Java中所有的关键字 所有标识符必须以大小写字母或$或_开头,首字母之后可以用数字 不 ...
- 常见web中间件漏洞(三)Nginx漏洞
nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,有 开源,内存占用少,并发能力强,自由模块化,支持epoll模型,可限制连接数,支持热部署,简单 ...
- python关于多级包之间的引用问题
首先得明确包和模块. 包:在一个目录下存在__init__.py,那么该目录就是一个包. 模块:一个.py文件就是一个模块. 我们可以通过from 包 import 模块来引入python文件, 也可 ...
- SQL 练习3
查询存在" 01 "课程,可能不存在" 02 "课程的情况(不存在时显示为 null ) SELECT * FROM (SELECT * FROM SC WHE ...
- maven打jar包,导入本地jar
本地jar包存放目录 项目目录/lib/*.jar 导入jar包配置 <resources> <!--扫描到的配置yml--> <resource> <dir ...
- @CreatedDate@CreatedBy@LastModifiedBy@LastModifiedDate
启动类上加上@EnableJpaAuditing 实体类,注意需要加上@EntityListeners(AuditingEntityListener.class)这个注解才能使@CreatedDate ...
- Mybatis框架及原理实例分析
摘要 本篇文章只是个人阅读mybatis源码总结的经验或者个人理解mybatis的基本轮廓,作为抛砖引玉的功能,希望对你有帮助,如果需要深入了解细节还需亲自去阅读源码. mybatis基本架构 myb ...
- Quartz任务调度(4)JobListener分版本超详细解析
JobListener 我们的jobListener实现类必须实现其以下方法: 方法 说明 getName() getName() 方法返回一个字符串用以说明 JobListener 的名称.对于注册 ...
- Semaphore 的使用思路
转自:https://www.cnblogs.com/klbc/p/9500947.html 最近在看一本书<Java并发编程 核心方法与框架>,打算一边学习一边把学习的经验记下来,所粘贴 ...