@qiniu/miku-delivery-mp-ks
Version:
Kuaishou Mini Program SDK for Miku Delivery
171 lines (170 loc) • 5.81 kB
JavaScript
/**
* @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);
}
});
});
}