兼容微信小程序的流式网络请求库
本项目从属于笔者的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:超时
兼容微信小程序的流式网络请求库相关推荐
- mpvue,koa开发微信小程序(二)网络请求相关
腾讯云(后台) 进入微信公众平台|小程序 - 设置 - 开发者工具 - 腾讯云扫码开通 - 后台管理 下载Node.js Domo - copy sever文件 - 直接粘贴在项目my-pro目录中 ...
- 微信小程序 wx.request异步网络请求
wx.request({url: 'https://请求的域名/', //仅为示例,并非真实的接口地址method: 'POST',data: {sessionId: sessionId},heade ...
- 微信小程序开发实战(网络请求设置)
@作者 : SYFStrive @博客首页 : HomePage
- iphone/苹果手机 微信小程序 真机调试 网络不通 网络请求失败
问题 问题:iphone/苹果手机 微信小程序 真机调试 网络请求失败,可以确定的是,真机和开发工具所在电脑肯定是在一个网段的,把蜂窝数据都关了,只保留了WIFI,还是请求不通, 解决 最终参考 微信 ...
- 微信小程序、流应用、原生应用app、轻应用
引言介绍: 应用分为:原生应用(Native APP).轻应用(webapp或者h5app)和混合应用(HibidAPP) 其中流应用和轻应用现在多基于浏览器开啊H5应用程序 小程序是基于微信平台(软 ...
- Android微信小程序原理,微信小程序事件流原理解析
这篇文章主要介绍了微信小程序事件流原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.什么是事件? 事件是视图层到逻辑层的通讯方式: 事件可 ...
- 微信小程序开发工具能正常请求后台数据,手机预览请求失败
微信小程序开发工具能正常请求后台数据,手机预览请求失败 问题描述 微信开发者工具调试完想用手机预览效果,结果发现凡是后台请求都失败. 原因分析 可能的原因有三个: 微信开发者工具详情里的本地设置,没有 ...
- 微信小程序上线后,苹果手机请求不到数据,安卓可以
微信小程序上线后,苹果手机请求不到数据,安卓可以 首先说明一下我的小程序页面是嵌入的网页--webview,在网页里面,会有各种网络请求,上线后,安卓手机测试没有问题,苹果手机能加载到页面,但是没有请 ...
- 小程序promise封装post请求_微信小程序promise封装get/post请求
微信小程序promise封装get/post请求 2020-07-04 20:42:49 微信小程序promise封装get/post请求 叶子兔 2018-10-10 08:55:30 1056 ...
最新文章
- 隐马尔科夫模型HMM(一)HMM模型
- 直接依赖,间接依赖,可选依赖,排除依赖,依赖冲突
- Scrum Master的成功定义是什么?
- BZOJ3509 [CodeChef] COUNTARI 【分块 + fft】
- LeetCode Reverse Nodes in k-Group(单链表连续分段反转)
- 微信公众平台--3.普通消息交互(发送与接收)
- 新疆大学(新大)OJ xju 1006: 比赛排名 第二类斯特林数+阶乘
- Selenium的定位元素
- DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
- 自动生成 Makefile 的全过程详解
- python batch_size_Python config.batch_size方法代码示例
- SERVER 2008 +MSSQL2008+SCCM安装记录
- Arcmap计算土方量教程
- iis php前景,IIS下PHP的ISAPI和FastCGI比较
- 瑞幸咖啡,成败今年见分晓!
- tomcat服务器拒绝访问文件,tomcat拒绝访问特定文件
- C++ Opencv binarization thinning and bone processing
- vue echarts绘制市级地图下钻(带注释)
- Pandas 时间序列 - 实例方法与重采样
- java4android网易云,Android仿网易云音乐播放界面