1. 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. 1 import request from 'umi-request';
  2. 2
  3. 3 request
  4. 4 .get('/api/v1/xxx?id=1')
  5. 5 .then(function(response) {
  6. 6 console.log(response);
  7. 7 })
  8. 8 .catch(function(error) {
  9. 9 console.log(error);
  10. 10 });

同时,也可将请求的url参数放在options,params中:

  1. 1 request.get('/api/v1/xxx', {
  2. 2 params: {
  3. 3 id: 1,
  4. 4 },
  5. 5 })
  6. 6 .then(function(response) {
  7. 7 console.log(response);
  8. 8 })
  9. 9 .catch(function(error) {
  10. 10 console.log(error);
  11. 11 });

执行基本的post请求:

  1. 1 request
  2. 2 .post('/api/v1/user', {
  3. 3 data: {
  4. 4 name: 'Mike',
  5. 5 },
  6. 6 })
  7. 7 .then(function(response) {
  8. 8 console.log(response);
  9. 9 })
  10. 10 .catch(function(error) {
  11. 11 console.log(error);
  12. 12 });

umi-request的相关API:

可以通过向 umi-request 传参来发起请求,在method中指定请求方式。

umi-request(url[, options]):

示例:

  1. 1 import request from 'umi-request';
  2. 2
  3. 3 request('/api/v1/xxx', {
  4. 4 method: 'get',
  5. 5 params: { id: 1 },
  6. 6 })
  7. 7 .then(function(response) {
  8. 8 console.log(response);
  9. 9 })
  10. 10 .catch(function(error) {
  11. 11 console.log(error);
  12. 12 });
  13. 13
  14. 14 request('/api/v1/user', {
  15. 15 method: 'post',
  16. 16 data: {
  17. 17 name: 'Mike',
  18. 18 },
  19. 19 })
  20. 20 .then(function(response) {
  21. 21 console.log(response);
  22. 22 })
  23. 23 .catch(function(error) {
  24. 24 console.log(error);
  25. 25 });

相关请求方法的别名,之后可以不用单独在method中配置请求方式。

  1. request.get(url[, options])
  2.  
  3. request.post(url[, options])
  4.  
  5. request.delete(url[, options])
  6.  
  7. request.put(url[, options])
  8.  
  9. request.patch(url[, options])
  10.  
  11. request.head(url[, options])
  12.  
  13. request.options(url[, options])

如果有些配置多个请求当中都有使用到,则可以通过extend创建一个umi-request实例,将公共的配置放置在实例中。则可以实现配置的简化:extend([options])

示例:

  1. 1 import { extend } from 'umi-request';
  2. 2
  3. 3 const request = extend({
  4. 4 prefix: '/api/v1',
  5. 5 timeout: 1000,
  6. 6 headers: {
  7. 7 'Content-Type': 'multipart/form-data',
  8. 8 },
  9. 9 });

之后这个get请求便可以使用extend中的公共配置。

  1. 1 request
  2. 2 .get('/user')
  3. 3 .then(function(response) {
  4. 4 console.log(response);
  5. 5 })
  6. 6 .catch(function(error) {
  7. 7 console.log(error);
  8. 8 });

其他的请求方式同理。例如:post delete put patch head options 等。

请求参数的配置:request options 中的参数详情:

extend options的参数支持以上的所有参数。

 参数含义详情:

  1. 1 {
  2. 2 // 'method' 是创建请求时使用的方法
  3. 3 method: 'get', // default
  4. 4
  5. 5 // 'params' 是即将于请求一起发送的 URL 参数,参数会自动 encode 后添加到 URL 中
  6. 6 // 类型需为 Object 对象或者 URLSearchParams 对象
  7. 7 params: { id: 1 },
  8. 8
  9. 9 // 'paramsSerializer' 开发者可通过该函数对 params 做序列化(注意:此时传入的 params 为合并了 extends 中 params 参数的对象,如果传入的是 URLSearchParams 对象会转化为 Object 对象
  10. 10 paramsSerializer: function (params) {
  11. 11 return Qs.stringify(params, { arrayFormat: 'brackets' })
  12. 12 },
  13. 13
  14. 14 // 'data' 作为请求主体被发送的数据
  15. 15 // 适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  16. 16 // 必须是以下类型之一:
  17. 17 // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  18. 18 // - 浏览器专属:FormData, File, Blob
  19. 19 // - Node 专属: Stream
  20. 20 data: { name: 'Mike' },
  21. 21
  22. 22 // 'headers' 请求头
  23. 23 headers: { 'Content-Type': 'multipart/form-data' },
  24. 24
  25. 25 // 'timeout' 指定请求超时的毫秒数(0 表示无超时时间)
  26. 26 // 如果请求超过了 'timeout' 时间,请求将被中断并抛出请求异常
  27. 27 timeout: 1000,
  28. 28
  29. 29 // ’prefix‘ 前缀,统一设置 url 前缀
  30. 30 // ( e.g. request('/user/save', { prefix: '/api/v1' }) => request('/api/v1/user/save') )
  31. 31 prefix: '',
  32. 32
  33. 33 // ’suffix‘ 后缀,统一设置 url 后缀
  34. 34 // ( e.g. request('/api/v1/user/save', { suffix: '.json'}) => request('/api/v1/user/save.json') )
  35. 35 suffix: '',
  36. 36
  37. 37 // 'credentials' 发送带凭据的请求
  38. 38 // 为了让浏览器发送包含凭据的请求(即使是跨域源),需要设置 credentials: 'include'
  39. 39 // 如果只想在请求URL与调用脚本位于同一起源处时发送凭据,请添加credentials: 'same-origin'
  40. 40 // 要改为确保浏览器不在请求中包含凭据,请使用credentials: 'omit'
  41. 41 credentials: 'same-origin', // default
  42. 42
  43. 43 // ’useCache‘ 是否使用缓存,当值为 true 时,GET 请求在 ttl 毫秒内将被缓存,缓存策略唯一 key 为 url + params + method 组合
  44. 44 useCache: false, // default
  45. 45
  46. 46 // ’ttl‘ 缓存时长(毫秒), 0 为不过期
  47. 47 ttl: 60000,
  48. 48
  49. 49 // 'maxCache' 最大缓存数, 0 为无限制
  50. 50 maxCache: 0,
  51. 51
  52. 52 // 根据协议规范, GET 请求用于获取、查询服务端数据,在数据更新频率不频繁的情况下做必要的缓存能减少服务端的压力,因为缓存策略是默认对 GET 请求做缓存,但对于一些特殊场景需要缓存其他类型请求的响应数据时,我们提供 validateCache 供用户自定义何时需要进行缓存, key 依旧为 url + params + method
  53. 53 validateCache: (url, options) => { return options.method.toLowerCase() === 'get' },
  54. 54
  55. 55 // 'requestType' 当 data 为对象或者数组时, umi-request 会根据 requestType 动态添加 headers 和设置 body(可传入 headers 覆盖 Accept 和 Content-Type 头部属性):
  56. 56 // 1. requestType === 'json' 时, (默认为 json )
  57. 57 // options.headers = {
  58. 58 // Accept: 'application/json',
  59. 59 // 'Content-Type': 'application/json;charset=UTF-8',
  60. 60 // ...options.headers,
  61. 61 // }
  62. 62 // options.body = JSON.stringify(data)
  63. 63 // 2. requestType === 'form' 时,
  64. 64 // options.headers = {
  65. 65 // Accept: 'application/json',
  66. 66 // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
  67. 67 // ...options.headers,
  68. 68 // };
  69. 69 // options.body = query-string.stringify(data);
  70. 70 // 3. 其他 requestType
  71. 71 // options.headers = {
  72. 72 // Accept: 'application/json',
  73. 73 // ...options.headers,
  74. 74 // };
  75. 75 // options.body = data;
  76. 76 requestType: 'json', // default
  77. 77
  78. 78 // ’parseResponse‘ 是否对请求返回的 Response 对象做格式、状态码解析
  79. 79 parseResponse: true, // default
  80. 80
  81. 81 // ’charset‘ 当服务端返回的数据编码类型为 gbk 时可使用该参数,umi-request 会按 gbk 编码做解析,避免得到乱码, 默认为 utf8
  82. 82 // 当 parseResponse 值为 false 时该参数无效
  83. 83 charset: 'gbk',
  84. 84
  85. 85 // 'responseType': 如何解析返回的数据,当 parseResponse 值为 false 时该参数无效
  86. 86 // 默认为 'json', 对返回结果进行 Response.text().then( d => JSON.parse(d) ) 解析
  87. 87 // 其他(text, blob, arrayBuffer, formData), 做 Response[responseType]() 解析
  88. 88 responseType: 'json', // default
  89. 89
  90. 90 // 'throwErrIfParseFail': 当 responseType 为 json 但 JSON.parse(data) fail 时,是否抛出异常。默认不抛出异常而返回 Response.text() 后的结果,如需要抛出异常,可设置 throwErrIfParseFail 为 true
  91. 91 throwErrIfParseFail: false, // default
  92. 92
  93. 93 // 'getResponse': 是否获取源 Response, 返回结果将包含一层: { data, response }
  94. 94 getResponse: false,// default
  95. 95
  96. 96 // 'errorHandler' 统一的异常处理,供开发者对请求发生的异常做统一处理,详细使用请参考下方的错误处理文档
  97. 97 errorHandler: function(error) { /* 异常处理 */ },
  98. 98
  99. 99 // 'cancelToken' 取消请求的 Token,详细使用请参考下方取消请求文档
  100. 100 cancelToken: null,
  101. 101 }

实例化请求实例之后,若还需要动态更新参数,umi-request中的extendOptions方法供用户进行更新。

  1. const request = extend({ timeout: 1000, params: { a: '1' } });
  2. // 默认参数是 { timeout: 1000, params: { a: '1' }}
  3.  
  4. request.extendOptions({ timeout: 3000, params: { b: '2' } });
  5. // 此时默认参数是 { timeout: 3000, params: { a: '1', b: '2' }}

响应结构:

响应对象Response如下:

  1. 1 {
  2. 2 // `data` 由服务器提供的响应, 需要进行解析才能获取
  3. 3 data: {},
  4. 4
  5. 5 // `status` 来自服务器响应的 HTTP 状态码
  6. 6 status: 200,
  7. 7
  8. 8 // `statusText` 来自服务器响应的 HTTP 状态信息
  9. 9 statusText: 'OK',
  10. 10
  11. 11 // `headers` 服务器响应的头
  12. 12 headers: {},
  13. 13 }

当 options.getResponse === false 时, 响应结构为解析后的 data:

  1. request.get('/api/v1/xxx', { getResponse: false }).then(function(data) {
  2. console.log(data);
  3. });

当 options.getResponse === true 时,响应结构为包含 data 和 Response 的对象:

  1. request.get('/api/v1/xxx', { getResponse: true }).then(function({ data, response }) {
  2. console.log(data);
  3. console.log(response.status);
  4. console.log(response.statusText);
  5. console.log(response.headers);
  6. });

错误处理:

  1. 1 import request, { extend } from 'umi-request';
  2. 2
  3. 3 const errorHandler = function(error) {
  4. 4 const codeMap = {
  5. 5 '021': '发生错误啦',
  6. 6 '022': '发生大大大大错误啦',
  7. 7 // ....
  8. 8 };
  9. 9 if (error.response) {
  10. 10 // 请求已发送但服务端返回状态码非 2xx 的响应
  11. 11 console.log(error.response.status);
  12. 12 console.log(error.response.headers);
  13. 13 console.log(error.data);
  14. 14 console.log(error.request);
  15. 15 console.log(codeMap[error.data.status]);
  16. 16 } else {
  17. 17 // 请求初始化时出错或者没有响应返回的异常
  18. 18 console.log(error.message);
  19. 19 }
  20. 20
  21. 21 throw error; // 如果throw. 错误将继续抛出.
  22. 22
  23. 23 // 如果return, 则将值作为返回. 'return;' 相当于return undefined, 在处理结果时判断response是否有值即可.
  24. 24 // return {some: 'data'};
  25. 25 };
  26. 26
  27. 27 // 1. 作为统一错误处理
  28. 28 const extendRequest = extend({ errorHandler });
  29. 29
  30. 30 // 2. 单独特殊处理, 如果配置了统一处理, 但某个api需要特殊处理. 则在请求时, 将errorHandler作为参数传入.
  31. 31 request('/api/v1/xxx', { errorHandler });
  32. 32
  33. 33 // 3. 通过 Promise.catch 做错误处理
  34. 34 request('/api/v1/xxx')
  35. 35 .then(function(response) {
  36. 36 console.log(response);
  37. 37 })
  38. 38 .catch(function(error) {
  39. 39 return errorHandler(error);
  40. 40 });

中间件机制,详情请转至:https://github.com/umijs/umi-request/blob/master/README_zh-CN.md

umi request 请求资源库详解的更多相关文章

  1. HTTP请求方法详解

    HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源]     GET方法用来请求已被URI识别的资源.指定 ...

  2. 在ASP.NET 5应用程序中的跨域请求功能详解

    在ASP.NET 5应用程序中的跨域请求功能详解 浏览器安全阻止了一个网页中向另外一个域提交请求,这个限制叫做同域策咯(same-origin policy),这组织了一个恶意网站从另外一个网站读取敏 ...

  3. Spring RestController 请求参数详解

    Spring RestController 请求参数详解 引用作者jpfss 在阅读之前,最好先了解http请求的get,post,以及各种head头类型,请求参数类型. 无参数,设置RestCont ...

  4. Servlet技术——request、respone详解

    Servlet之request.respone详解 Request (一) 概述 request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个reque ...

  5. AJAX(XMLHttpRequest)进行跨域请求方法详解

    AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...

  6. JS JSOP跨域请求实例详解

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...

  7. Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

    RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...

  8. Spring— 用更优雅的方式发HTTP请求(RestTemplate详解)

    RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...

  9. springMVC请求流程详解

    SpringMVC框架是一个基于请求驱动的Web框架,并且使用了'前端控制器'模型来进行设计,再根据'请求映射规则'分发给相应的页面控制器进行处理. (一)整体流程 具体步骤: 1.  首先用户发送请 ...

随机推荐

  1. asp .net core中swagger的简单使用

    相信swagger大家不太陌生,简单来说就是把web api接口以ui的形式呈现到页面上,供方便调用和展示.这边文章就带大家初步简单使用swagger. (1)首先需要安装包:Swashbuckle. ...

  2. cpu设计实践1

    本栏目将实现一个简单cpu(8-32位)的设计,使用xinlink spatan6平台

  3. Docker创建Gitea(git服务)

    背景 Gitea是流行的自托管Git服务Gogs的社区分支.gogs作者想一个人维护gogs,但是大家想一起维护.就把gogs项目fork了. 下面是gitea的介绍: https://blog.gi ...

  4. javaWeb常用面试题

    JDBC JDBC访问数据库的基本步骤是什么? 加载驱动 通过DriverManager对象获取连接对象Connection 通过连接对象获取会话,有2种方式Statement.PreparedSta ...

  5. Java之Apache Commons-IO使用精讲

    Commons IO是针对开发IO流功能的工具类库.主要包括六个区域: 工具类--使用静态方法执行共同任务输入--用于InputStream和Reader实现输出--用于OutputStream和Wr ...

  6. linux centos7安装部署gitlab服务器

    refer:https://www.globo.tech/learning-center/install-gitlab-centos-7/#:~:text=How%20to%20Install%20G ...

  7. 使用filter过滤GZIP压缩(二)

    在代码之前,讲一下用filter实现GZIP压缩的原理: 因为GZIP压缩之后,是从服务器端传输到浏览器端,从servlet到浏览器(从jsp到浏览器),其实是response带回内容,所以我们要在f ...

  8. JFrame显示刷新

    1 import java.awt.BorderLayout; 2 import java.awt.Font; 3 import java.awt.event.ActionEvent; 4 impor ...

  9. go defer关键字使用规则

    defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 数据结构 type _defer struct { sp uintptr //函数栈指针 pc ...

  10. redhat9 linux 网卡无法激活排障

    先查看自己的系统版本! [root@localhost root]# uname -a Linux localhost 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 ...