此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/405144/818469/HttpRequest.js
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
(我已經安裝了使用者樣式管理器,讓我安裝!)
// ==UserScript==
// @name HttpRequest
// @namespace hoehleg.userscripts.private
// @version 0.1
// @description HttpRequest for any type of request and HttpRequestHTML to request webpage. Supports caching of responses to handle status 304.
// @author Gerrit Höhle
//
// @grant GM_xmlhttpRequest
//
// @require https://gf.qytechs.cn/scripts/405143-simplecache/code/SimpleCache.js
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js
//
// ==/UserScript==
/* jshint esnext: true */
/* globals SimpleCache, $, jQuery */
const HttpRequest = (() => {
const responsesCache = new SimpleCache({ keyExtractor: (httpRequest) => [ httpRequest.method, httpRequest.url, httpRequest.headers, httpRequest.data, httpRequest.params ].join() });
const urlWithParams = (url, paramsObject) => {
const params = Object.entries(paramsObject).map(([key, value]) => key + '=' + value).join('&');
return (url.length > 0) ? url + '?' + params : params;
};
return class HttpRequest {
constructor({ method, url = window.location.href, headers = {}, data = '', keepInCacheTimoutMs = 10 * 60000, params = {} } = {}) {
Object.assign(this, { method, url, headers, data, keepInCacheTimoutMs, params });
}
send() {
return new Promise((resolve, reject) => {
const method = this.method.toUpperCase();
let url = this.url;
let headers = this.headers;
let data = this.data;
const onload = (response) => {
switch (response.status) {
case 200:
if (this.keepInCacheTimoutMs > 0) {
responsesCache.set(this, response, this.keepInCacheTimoutMs);
}
break;
case 304:
if (this.isCached()) {
response = this.getFromCache();
response.status = 304;
}
break;
default:
reject(Error(`Status: ${response.status}, Error: ${response.statusText}`));
return;
}
resolve(response);
};
const onerror = () => {
reject(Error('network error'));
};
switch (method) {
case 'GET':
if (this.params) {
url = urlWithParams(url, this.params);
}
break;
case 'POST':
case 'PUT':
headers = Object.assign({ 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, headers || {});
if (this.params) {
data = urlWithParams(data, this.params);
}
break;
}
GM_xmlhttpRequest({ method, url, onload, onerror: onError, headers, data });
});
}
isCached() {
return responsesCache.has(this);
}
getFromCache() {
return responsesCache.get(this);
}
static send(...args) {
return new HttpRequest(...args).send();
}
};
})();
class HttpRequestHtml extends HttpRequest {
constructor({ url, method = "GET", headers, data, keepInCacheTimoutMs, params } = {}) {
super({ method, url, headers, data, keepInCacheTimoutMs, params });
}
send() {
return super.send().then(response => new Promise(resolve => {
if (response.status == 200) {
response.html = new DOMParser().parseFromString(response.responseText, 'text/html');
resolve(response);
}
}));
}
static send(...args) {
return new HttpRequestHtml(...args).send();
}
}