UNPKG

@qiniu/miku-delivery-mp-ks

Version:

Kuaishou Mini Program SDK for Miku Delivery

171 lines (170 loc) 5.81 kB
/** * @file 小程序环境发送 HTTP 请求(类 Web Fetch 接口) * @desc 适合简单的、请求体 & 响应体基于文本的接口调用 */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import Headers from './headers'; import { mpPlatform } from '../env'; export class Response { get ok() { return this.status >= 200 && this.status < 300; } get statusText() { return ''; // TODO } constructor(_body, init) { Object.defineProperty(this, "_body", { enumerable: true, configurable: true, writable: true, value: _body }); Object.defineProperty(this, "status", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "headers", { enumerable: true, configurable: true, writable: true, value: void 0 }); /** [私货] 本次请求的性能相关信息;注意:这个信息可能没有,比如在微信开发者工具中运行时 */ Object.defineProperty(this, "_profile", { enumerable: true, configurable: true, writable: true, value: void 0 }); this.status = init.status; this.headers = init.headers; this._profile = init._profile; } json() { return __awaiter(this, void 0, void 0, function* () { const parsed = JSON.parse(this._body); return parsed; }); } } export { Headers }; export function fetch(request) { switch (mpPlatform) { case 'wx': return fetchWx(request); case 'tt': return fetchTt(request); case 'ks': return fetchKs(request); } } function fetchWx({ url, method, headers, body }) { const header = { // 避免 `wx.request` 默认发 `content-type: application/json` 的行为,后者可能会导致问题(如 httpdns 接口会 400) 'content-type': 'none' }; if (headers != null) { headers.forEach((value, key) => { header[key] = value; }); } return new Promise((resolve, reject) => { wx.request({ url, method, header, data: body, dataType: '其他', enableHttp2: true, success(result) { const status = result.statusCode; resolve(new Response(result.data, { status, headers: new Headers(result.header), _profile: result.profile })); }, fail(err) { reject(err); } }); }); } function fetchTt({ url, method, headers, body }) { const header = { // 避免 `tt.request` 默认发 `content-type: application/json` 的行为,后者可能会导致问题(如 httpdns 接口会 400) 'content-type': 'none' }; if (headers != null) { headers.forEach((value, key) => { header[key] = value; }); } return new Promise((resolve, reject) => { tt.request({ url, method: method, header, data: body, dataType: 'string', success(result) { const status = result.statusCode; const profile = result.profile; resolve(new Response(result.data, { status, headers: new Headers(result.header), _profile: Object.keys(profile).length === 0 ? undefined : profile // 抖音小程序开发工具中会得到 `profile: {}` })); }, fail(err) { reject(err); } }); }); } function fetchKs({ url, method, headers, body }) { const header = { // 避免 `ks.request` 默认发 `content-type: application/json` 的行为,后者可能会导致问题(如 httpdns 接口会 400) 'content-type': 'text/plain' }; if (headers != null) { headers.forEach((value, key) => { header[key] = value; }); } const startAt = Date.now(); return new Promise((resolve, reject) => { ks.request({ url, method: method, header, data: body, dataType: 'string', success(result) { const status = result.statusCode; // 快手小程序没有 profile 信息,这里自己度量并构造之 const profile = { fetchStart: startAt, connectStart: undefined, connectEnd: undefined, responseEnd: Date.now() }; resolve(new Response(result.data, { status, headers: new Headers(result.header), _profile: profile })); }, fail(err) { reject(err); } }); }); }