WeChat アプレットはネイティブ リクエストをどのようにカプセル化しますか?インターフェイスを呼び出すにはどうすればよいですか?次の記事では、ネイティブ WeChat アプレットでリクエストをカプセル化し、インターフェイスをエレガントに呼び出す方法を紹介します。
アプレットの ネイティブ リクエストに基づく Promise スタイルのリクエストをカプセル化する
マルチレベル コールバック (コールバック 地獄) を回避する
ネットワーク リクエストの統合処理と分散エラー
. ├── api │ ├── config.js // 相关请求的配置项,请求api等 │ ├── env.js // 环境配置 │ ├── request.js // 封装主函数 │ ├── statusCode.js // 状态码 └── ...
// env.js module.exports = { ENV: 'production', // ENV: 'test' }
// statusCode.js // 配置一些常见的请求状态码 module.exports = { SUCCESS: 200, EXPIRE: 403 }
// config.js const { ENV } = require('./env') let BASEURL switch (ENV) { case 'production': BASEURL = '' break case 'test': BASEURL = '' break default: BASEURL = '' break } module.exports = { BASEURL,// 项目接口地址,支持多域名 }
注 64~68行目はトークンの有効期限の処理です。login呼び出し時にapp.globalDataにトークンが存在するか確認します。存在する場合はログインリクエストは開始されません。トークンの有効期限が切れてトークンがクリアされていれば、ログインリクエストは行われます。次のリクエストで再開始されます。これにより、新しいトークンが再取得されます
// 引入状态码statusCode const statusCode = require('./statusCode') // 定义请求路径, BASEURL: 普通请求API; CBASEURL: 中台API,不使用中台可不引入CBASEURL const { BASEURL } = require('./config') // 定义默认参数 const defaultOptions = { data: {}, ignoreToken: false, form: false, } /** * 发送请求 * @params * method: <String> 请求方式: POST/GET * url: <String> 请求路径 * data: <Object> 请求参数 * ignoreToken: <Boolean> 是否忽略token验证 * form: <Boolean> 是否使用formData请求 */ function request (options) { let _options = Object.assign(defaultOptions, options) let { method, url, data, ignoreToken, form } = _options const app = getApp() // 设置请求头 let header = {} if (form) { header = { 'content-type': 'application/x-www-form-urlencoded' } } else { header = { 'content-type': 'application/json' //自定义请求头信息 } } if (!ignoreToken) { // 从全局变量中获取token let token = app.globalData.token header.Authorization = `Bearer ${token}` } return new Promise((resolve, reject) => { wx.request({ url: BASEURL + url, data, header, method, success: (res) => { let { statusCode: code } = res if (code === statusCode.SUCCESS) { if (res.data.code !== 0) { // 统一处理请求错误 showToast(res.data.errorMsg) reject(res.data) return } resolve(res.data) } else if (code === statusCode.EXPIRE) { app.globalData.token = '' showToast(`登录过期, 请重新刷新页面`) reject(res.data) } else { showToast(`请求错误${url}, CODE: ${code}`) reject(res.data) } }, fail: (err) => { console.log('%c err', 'color: red;font-weight: bold', err) showToast(err.errMsg) reject(err) } }) }) } // 封装toast函数 function showToast (title, icon='none', duration=2500, mask=false) { wx.showToast({ title: title || '', icon, duration, mask }); } function get (options) { return request({ method: 'GET', ...options }) } function post (options) { // url, data = {}, ignoreToken, form return request({ method: 'POST', ...options }) } module.exports = { request, get, post }
新しい API ファイル (takeここでは例として順序インターフェイスを示します)、新しい api/index.js
(長すぎるインターフェイスが同じファイルに書き込まれるのを防ぐために、インターフェイスの配布は均一に処理されます)
ディレクトリ構造は次のとおりです。
. ├── api │ ├── config.js // 相关请求的配置项,请求api等 │ ├── index.js // 统一处理入口 │ ├── order.js // 订单接口 │ ├── request.js // 封装主函数 │ ├── statusCode.js // 状态码 └── ...
// order.js const request = require('./request') module.exports = { // data可以传入 url, data, ignoreToken, form, cToken apiName (data) { let url = 'apiUrl' return request.post({ url, data }) } }
const orderApi = require("./order") module.exports = { orderApi }
const { orderApi } = require('dir/path/api/index') ... 1. `Promise.then()`链式调用 func () { orderApi.apiName(params).then(res => { // do Something }).catch(err => { // do Something }) } 2. `async/await` 调用 async func () { try { let res = await orderApi.apiName(params) // do Something } catch (err) { // do Something } }
説明 | データ型 | デフォルト値 | |
---|---|---|---|
インターフェース名 | String
| ##''
|
|
リクエスト本文 | オブジェクト |
| {}
|
リクエストがトークンを運ぶかどうか | ブール値 |
| false
|
フォームリクエストかどうか | ブール値 |
| false
|
以上がネイティブ ミニ プログラムはどのようにしてリクエストをカプセル化し、インターフェイスをエレガントに呼び出すことができるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。