@bbfe/data-provider

1.0.3 • Public • Published

Data provider [NEW]

基于Fetch规范的请求处理模块,提供对Request和Response对象的切面,具备请求合并的能力。

Links

Install

npm install @bbfe/data-provider

Quick Start

import DataProvider from 'data-provider';
import pathToRegexp from 'path-to-regexp';
import { isObject } from 'lodash';

let baseURL = 'http://mock.bbfe.group/mock/5a1e89e8d3ef9a75725992d3/snc/api/v1';
let id = 0;

const urlCompiler = (path, params) => {
  let url = pathToRegexp.compile(path)(params);
  return url;
};

let dataProvider = new DataProvider({
  timeout: 5000,
  requestIdResolver: function(options) {
    return options.method === 'GET' ? JSON.stringify({ options }) : id++;
  }
});

dataProvider.addRequestInterceptor(request => {
  console.log('--------------request:', request);
  return request;
});

dataProvider.addResponseInterceptor(response => {
  console.log('--------------response:', response);
  return response;
});

const request = async (url, method, body, query) => {
  let options = {
    url,
    method,
    baseURL: baseURL || '',
    headers: {
      'Content-Type': 'application/json'
    }
  };
  if (body) {
    options.body = isObject(body) ? JSON.stringify(body) : body;
  }
  if (query) {
    options.query = query;
  }
  let res = await dataProvider.request(options);
  if (res instanceof Error || res.status === 204) {
    return res;
  } else {
    return res.clone().json();
  }
};


async getAdmin({ path, params }) {
  let url = urlCompiler(path, params);
  let data = await request(url, 'GET');
  return data;
}

getAdmin({ path: '/admins/:adminId', params: { adminId: 1 } })
.then(data => {
  if (data instanceof Error) {
    console.log(data.toString());
  } else {
    conselo.log(data);
  }
});

Options

new DataProvider(options)

初始化DataProvider 实例需要的参数如下:

参数名 默认值 参数类型 说明
timeout 5000 Number 请求超时的时间
requestIdResolver () => id++ Function 用于产生请求id的策略函数,如果多个请求的id相等,则这几个请求会被合并。

dataProvider.request(options)

DataProvider实例发起请求时需要的参数如下:

参数名 默认值 参数类型 说明
url -(必传) string 资源的URL(包含param)
headers {'Accept':'application/json, text/plain, */*'} object 请求头,Accept已经默认加上了。
method 'GET' string 请求的方法
baseURL - string 提供了这个参数的话,他会被拼接到url的前面
body - string/object 请求数据,可以是Blob, BufferSource, FormData, URLSearchParams, 或 USVString对象(from mdn
query - string/object query参数,会被拼接到url的后面
mode 'cors' string 请求的模式, 比如 cors, no-cors, same-origin, 或 navigate。默认值应该为 cors。(from mdn
credentials 'include' string 想要在请求中使用的credentials:: omit, same-origin, 或 include。data-provider将其默认设为了include,即一直会带上cookie。如果不希望这样,需要自行将其设为omit。
cache 'default' string 请求中想要使用的cache mode。(from mdn
redirect 'follow' string 对重定向处理的模式: follow, error, or manual。(from mdn
referrer 'client' string 可选值no-referrer, client, 或一个 URL的 USVString 。(from mdn
integrity - string 包括请求的 subresource integrity 值(from mdn

除此之外,options也可以是一个Request对象,如果直接传入Request对象的话,data-provider会直接以这个Request对象发起请求。

Noticifications

  • 请确保body中的内容与headers里的Content-Type是对应的,否则可能会出现请求发送失败的情况,新版data-provider默认只添加'Accept'的相关headers。
  • 如果业务中需要针对不同的Content-Type对body进行序列化处理,如有需求, 可引入qsjquery-param等包。
  • 发送请求时,参数可能会包括param、query、body,其中param应该在传入url时就已经拼接在url里面了,只有query和body才应该以参数的形式传入。
  • query应该是个单层对象或字符串,如 { type: 'super', group: 1 } 或 'type=1&group=super' 或 '?type=1&group=super'。
  • data-provider.request返回的是一个Response对象,需要按业务需求对其执行json化或者其他操作(详细内容请参考mdn对Response的描述)。
  • cookie默认是一直会带上的,如果不希望带cookie,需要自行在options中将'credentials'设为'omit'。

Readme

Keywords

Package Sidebar

Install

npm i @bbfe/data-provider

Weekly Downloads

3

Version

1.0.3

License

ISC

Last publish

Collaborators

  • misic
  • oscar-ren
  • a06062125
  • bbfe