开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 45

Mr.Chen/myCode

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
标签 (2)
master
1.0.1
1.0.0
master
分支 (1)
标签 (2)
master
1.0.1
1.0.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
标签 (2)
master
1.0.1
1.0.0
myCode
/
Tools
/
src
/
request.ts
myCode
/
Tools
/
src
/
request.ts
request.ts 6.69 KB
一键复制 编辑 原始数据 按行查看 历史
阿宇的编程之旅 提交于 2022年09月09日 17:11 +08:00 . feat:diff
import { urlJoin, defer, jsonToString, stringToJson, IRequest, IRequestBase, IRequestInit, IInterceptors, IUrl, IObject, IRequestBody, IRequestOptions } from "./index.js"
import { request } from "http"
import { parse } from "url"
class Interceptors implements IInterceptors {
private requestSuccess: Function
private responseSuccess: Function
private error: Function
use(type, fn) {
switch (type) {
case "request":
this.requestSuccess = fn
break;
case "response":
this.responseSuccess = fn
break;
case "error":
this.error = fn
break;
}
return this
}
get reqFn() {
return this.requestSuccess
}
get resFn() {
return this.responseSuccess
}
get errFn() {
return this.error
}
}
abstract class RequestBase extends Interceptors implements IRequestBase {
readonly origin: string
constructor(origin) {
super()
this.origin = origin ?? ''
}
abstract fetch(url, opts): Promise<void>
abstract http(url, opts): Promise<void>
chackUrl = (url: string) => {
return url.startsWith('/')
}
fixOrigin = (fixStr: string) => {
if (this.chackUrl(fixStr)) return this.origin + fixStr
return fixStr
}
envDesc = () => {
if (typeof Window !== "undefined") {
return "Window"
}
return "Node"
}
errorFn = reject => err => reject(this.errFn?.(err) ?? err)
clearTimer = opts => !!opts.timer && (clearTimeout(opts.timer), opts.timer = null)
initAbort = (params) => {
const { controller, timer, timeout } = params
!!!timer && (params.timer = setTimeout(() => controller.abort(), timeout))
return params
}
requestType = () => {
switch (this.envDesc()) {
case "Window":
return this.fetch
case "Node":
return this.http
}
}
getDataByType = (type, response) => {
switch (type) {
case "text":
case "json":
case "blob":
case "formData":
case "arrayBuffer":
return response[type]()
default:
return response['json']()
}
}
formatBodyString = (bodyString) => {
return {
text: () => bodyString,
json: () => stringToJson(bodyString) ?? bodyString,
blob: () => stringToJson(bodyString),
formData: () => stringToJson(bodyString),
arrayBuffer: () => stringToJson(bodyString),
}
}
}
abstract class RequestInit extends RequestBase implements IRequestInit {
constructor(origin) {
super(origin)
}
abstract fetch(url, opts): Promise<void>
abstract http(url, opts): Promise<void>
initDefaultParams = (url, { method = "GET", query = {}, headers = {}, body = null, timeout = 30 * 1000, controller = new AbortController(), type = "json", ...others }) => ({
url: urlJoin(this.fixOrigin(url), query), method, headers, body: method === "GET" ? null : jsonToString(body), timeout, signal: controller?.signal, controller, type, timer: null, ...others
})
initFetchParams = (url, opts) => {
const params = this.initAbort(this.initDefaultParams(url, opts))
return this.reqFn?.(params) ?? params
}
initHttpParams = (url, opts) => {
const params = this.initAbort(this.initDefaultParams(url, opts))
const options = parse(params.url, true)
return this.reqFn?.({ ...params, ...options }) ?? { ...params, ...options }
}
}
export class Request extends RequestInit implements IRequest {
private request: Function
constructor(origin) {
super(origin)
this.request = this.requestType()
}
fetch = (_url, _opts) => {
const { promise, resolve, reject } = defer()
const { url, ...opts } = this.initFetchParams(_url, _opts)
const { signal } = opts
promise.finally(() => this.clearTimer(opts))
signal.addEventListener('abort', () => this.errorFn(reject));
fetch(url, opts).then((response) => {
if (response?.status >= 200 && response?.status < 300) {
return this.getDataByType(opts.type, response)
}
return this.errorFn(reject)
}).then(res => resolve(this.resFn?.(res) ?? res)).catch(this.errorFn(reject))
return promise
}
http = (_url, _opts) => {
const { promise, resolve, reject } = defer()
const params = this.initHttpParams(_url, _opts)
const { signal } = params
promise.finally(() => this.clearTimer(params))
const req = request(params, (response) => {
if (response?.statusCode >= 200 && response?.statusCode < 300) {
let data = "";
response.setEncoding('utf8');
response.on('data', (chunk) => data += chunk);
return response.on("end", () => {
const result = this.getDataByType(params.type, this.formatBodyString(data))
resolve(this.resFn?.(result) ?? result)
});
}
return this.errorFn(reject)(response?.statusMessage)
})
signal.addEventListener('abort', () => this.errorFn(reject)(req.destroy(new Error('request timeout'))));
req.on('error', this.errorFn(reject));
req.end();
return promise
}
GET = (url?: IUrl, query?: IObject<any>, _?: IRequestBody | void, opts?: IRequestOptions) => {
return this.request(url, { query, method: "GET", ...opts })
}
POST = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "POST", body, ...opts })
}
PUT = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "PUT", body, ...opts })
}
DELETE = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "DELETE", body, ...opts })
}
OPTIONS = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "OPTIONS", body, ...opts })
}
HEAD = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "HEAD", body, ...opts })
}
PATCH = (url?: IUrl, query?: IObject<any>, body?: IRequestBody, opts?: IRequestOptions) => {
return this.request(url, { query, method: "PATCH", body, ...opts })
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

基于js的一些小案例或者项目
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/gitee_java_coder/myCode.git
git@gitee.com:gitee_java_coder/myCode.git
gitee_java_coder
myCode
myCode
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /