本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列。如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文。如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于PayPal的RESTful API标准

Fluent Fetcher:兼容Weapp的流式网络请求库

笔者一直比较喜欢使用标准的Fetch API来进行浏览器端的网络请求,同时使用的是isomorphic-fetch保证接口类的可测试性。而本项目则是笔者借鉴了SuperAgent API的风格基于Fetch进行的二次封装,主要是提供了流式风格的构造与使用方法,同时对常见功能进行了扩展。另外,fluent-fetcher还原生支持Weapp,基于fluent-fetcher构造的接口类可以直接在Weapp环境下使用。

Basic Usage

Installation

可以使用npm install fluent-fetcher --save安装本项目,或者使用yarn add fluent-fetcher安装使用。

Instantiate:实例化

直接在需要使用的地方以import导入即可:

//@flow
import FluentFetcher from 'fluent-fetcher';

我们可以直接以实例化方式创建请求实例:

const host = "jsonplaceholder.typicode.com";
let fluentFetcher = new FluentFetcher({scheme: "http", host});

其中可选的构造参数有:

constructor({scheme = "http", //请求协议host = "api.com",  //域名encoding = "utf8",  //编码acceptType = "json" //接收的返回数据类型} = {}
)
{...}

而如果在项目中我们存在多个数据源,建议是在接口公共父类中创建多个数据源实例,这样具体的接口实现类皆可以使用使用this.xxxClient方式进行请求。

// @flow
//E路数据的服务端地址
const edataHost = 'api.edata.com';//公共资源的服务端地址
const ggzyHost = 'api.ggzy.com';export default class API {//用于抓取公共资源数据的APIggzyAPIClient: FluentFetcher = null;//EDATA,用于抓取E路数据的APIedataAPIClient: FluentFetcher = null;/*** @function 默认构造函数*/constructor() {//构造请求体this.ggzyAPIClient = new FluentFetcher({scheme: 'http',host: ggzyHost,responseContentType: "json"}).header({key: 'UserAgent',value: 'wap'}).header({key: 'Content-Type',value: 'application/json'});this.edataAPIClient = new FluentFetcher({scheme: 'http',host: edataHost,responseContentType: "json"}).header({key: 'UserAgent',value: 'wap'}).header({key: 'Content-Type',value: 'application/json'});}}

注意,如果你是在Weapp环境下,那么FluentFetcher会自动使用wx.request作为请求载体。

GET

//测试GET类型请求
describe('GET请求测试', function () {//https://jsonplaceholder.typicode.com/posts?userId=1it('获取博文', function (done) {fluentFetcher.parameter({"userId": "1"}).get("/posts").build().then((data) => {expect(data).to.be.a('array');expect(data.length).to.be.above(0);done();}).catch((error) => {done(error);});});});

POST


//测试POST类型请求
describe('POST请求测试', function () {//https://jsonplaceholder.typicode.com/posts?userId=1it('创建博文@表单编码格式', function (done) {fluentFetcher.parameter({title: 'foo',body: 'bar',userId: 1}).post("/posts", 'x-www-form-urlencoded').build().then((data) => {expect(data).to.be.a('object');expect(data.id).to.equal(101);expect(data.title).to.equal('foo');expect(data.body).to.equal('bar');expect(data.userId).to.equal(1);done();}).catch((error) => {done(error);});});//https://jsonplaceholder.typicode.com/posts?userId=1it('创建博文@JSON格式', function (done) {fluentFetcher.parameter({title: 'foo',body: 'bar',userId: 1}).post("/posts").build().then((data) => {expect(data).to.be.a('object');expect(data.id).to.equal(101);expect(data.title).to.equal('foo');expect(data.body).to.equal('bar');expect(data.userId).to.equal(1);done();}).catch((error) => {done(error);});});});

PUT/DELETE

类似于POST请求方法。

Advanced Usage

Encode:编码

项目使用了isomorphic-urlencode作为通用的编解码工具,正常的会支持UTF8与GBK两种编码方案。当我们以x-www-form-urlencoded格式发起POST/PUT/DELETE请求时,会自动会请求体进行编码工作。另外,如果我们使用pathSegment添加请求路径时候,也会自动进行编码操作。

Mock

在实际的项目中,譬如微信小程序里,可能我们的服务端尚未准备好或者域名没有审核通过,我们需要在前端进行Mock操作以模拟正常业务流程的返回。笔者在这里选定的Mock方案个人感觉还是比较轻量级的,即直接在构造实例时将你需要的Mock地址对应的数据传入即可。

//测试MOCK
describe('MOCK请求测试', function () {it('对于MOCK数据应该正常返回本地值', function (done) {fluentFetcher.get('/mock').mock({'/mock': {test: 'data'}}).build().then((data) => {expect(data).to.be.a('object');expect(data.test).to.equal('data');done();});});});

CORS:跨域请求

  • 浏览器跨域方法与基于Fetch的Web请求最佳实践

直接使用cors()函数添加CORS支持即可。

Error:异常处理

异常处理是我们项目中常见的操作,在Fluent Fetch中对于所有非200或者300系列的请求皆会抛出异常:

    if (response.status >= 200 && response.status < 300) {return response} else {var error = new Error(response.statusText);error.response = response;throw error}

笔者是推荐使用async/await加上try-catch语法进行异常处理:

    try {//发起数据请求let result = await this.post(`/quotation/bom/${bom.id}`, data);return successResponse;} catch (err) {return internalServerErrorResponse;}

RoadMap

  • Cache:缓存

  • Retry:失败重试

  • Timeout:超时

兼容微信小程序的流式网络请求库相关推荐

  1. mpvue,koa开发微信小程序(二)网络请求相关

    腾讯云(后台) 进入微信公众平台|小程序 - 设置 - 开发者工具 - 腾讯云扫码开通 - 后台管理 下载Node.js Domo - copy sever文件 - 直接粘贴在项目my-pro目录中 ...

  2. 微信小程序 wx.request异步网络请求

    wx.request({url: 'https://请求的域名/', //仅为示例,并非真实的接口地址method: 'POST',data: {sessionId: sessionId},heade ...

  3. 微信小程序开发实战(网络请求设置)

    @作者 : SYFStrive @博客首页 : HomePage

  4. iphone/苹果手机 微信小程序 真机调试 网络不通 网络请求失败

    问题 问题:iphone/苹果手机 微信小程序 真机调试 网络请求失败,可以确定的是,真机和开发工具所在电脑肯定是在一个网段的,把蜂窝数据都关了,只保留了WIFI,还是请求不通, 解决 最终参考 微信 ...

  5. 微信小程序、流应用、原生应用app、轻应用

    引言介绍: 应用分为:原生应用(Native APP).轻应用(webapp或者h5app)和混合应用(HibidAPP) 其中流应用和轻应用现在多基于浏览器开啊H5应用程序 小程序是基于微信平台(软 ...

  6. Android微信小程序原理,微信小程序事件流原理解析

    这篇文章主要介绍了微信小程序事件流原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是事件? 事件是视图层到逻辑层的通讯方式: 事件可 ...

  7. 微信小程序开发工具能正常请求后台数据,手机预览请求失败

    微信小程序开发工具能正常请求后台数据,手机预览请求失败 问题描述 微信开发者工具调试完想用手机预览效果,结果发现凡是后台请求都失败. 原因分析 可能的原因有三个: 微信开发者工具详情里的本地设置,没有 ...

  8. 微信小程序上线后,苹果手机请求不到数据,安卓可以

    微信小程序上线后,苹果手机请求不到数据,安卓可以 首先说明一下我的小程序页面是嵌入的网页--webview,在网页里面,会有各种网络请求,上线后,安卓手机测试没有问题,苹果手机能加载到页面,但是没有请 ...

  9. 小程序promise封装post请求_微信小程序promise封装get/post请求

    微信小程序promise封装get/post请求 2020-07-04 20:42:49 微信小程序promise封装get/post请求 叶子兔 2018-10-10 08:55:30  1056  ...

最新文章

  1. 隐马尔科夫模型HMM(一)HMM模型
  2. 直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突
  3. Scrum Master的成功定义是什么?
  4. BZOJ3509 [CodeChef] COUNTARI 【分块 + fft】
  5. LeetCode Reverse Nodes in k-Group(单链表连续分段反转)
  6. 微信公众平台--3.普通消息交互(发送与接收)
  7. 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘
  8. Selenium的定位元素
  9. DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
  10. 自动生成 Makefile 的全过程详解
  11. python batch_size_Python config.batch_size方法代码示例
  12. SERVER 2008 +MSSQL2008+SCCM安装记录
  13. Arcmap计算土方量教程
  14. iis php前景,IIS下PHP的ISAPI和FastCGI比较
  15. 瑞幸咖啡,成败今年见分晓!
  16. tomcat服务器拒绝访问文件,tomcat拒绝访问特定文件
  17. C++ Opencv binarization thinning and bone processing
  18. vue echarts绘制市级地图下钻(带注释)
  19. Pandas 时间序列 - 实例方法与重采样
  20. java4android网易云,Android仿网易云音乐播放界面

热门文章

  1. 如何手动的用jigloo设计器关联java界面文件 jigloo 设计器失去关联解决
  2. 改造HINT的输出方式
  3. 视频监控行业解决方案
  4. 元数据驱动设计 —— 为动态移动应用创建Web API
  5. 超级可靠、超低成本——BCH的雄心
  6. Loadrunner常见的乱码问题
  7. 程序员修炼之道阅读笔记01
  8. 《Python基础教程第二版》第二章-Python列表和元祖
  9. activiti框架 数据库设计说明书
  10. 手机QQ会员H5加速方案——sonic技术内幕