Skip to content

Commit

Permalink
feat: 新增 AnswererWrapper 参数: headers 和 type
Browse files Browse the repository at this point in the history
  • Loading branch information
enncy committed May 16, 2022
1 parent 081a99e commit 8c970bb
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 91 deletions.
45 changes: 27 additions & 18 deletions packages/core/src/components/SearchResults.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,32 +59,41 @@ export const SearchResults = defineComponent({
</div>

{currentSearchResults.value?.map((res) => (

<div class="search-results-container">

<span class="search-results-title">
<span>题库:</span>
<a href={res.homepage ? res.homepage : '#'} target="_blank">
{res.name}
</a>
一共有 {res.answers.length} 个答案
<span> {res.error ? '此题库请求错误: ' + res.error.message : `一共有 ${res.answers.length} 个答案`} </span>
</span>
<div style={{ paddingLeft: '12px' }}>
{res.answers.map((answer) => (
<div class="search-results-item">
<div title={answer.question}>
<span>
<span style="color: #a7a7a7">题目: </span>
{StringUtils.of(answer.question).nowrap().max(50).toString()}
</span>
</div>
<div title={answer.answer}>
<span>
<span style="color: #a7a7a7">回答: </span>
{StringUtils.of(answer.answer).nowrap().max(50).toString()}
</span>
</div>
{res.error
? (
<div></div>
)
: (
<div style={{ paddingLeft: '12px' }}>
{res.answers.map((answer) => (
<div class="search-results-item">
<div title={answer.question}>
<span>
<span style="color: #a7a7a7">题目: </span>
{StringUtils.of(answer.question).nowrap().max(50).toString()}
</span>
</div>
<div title={answer.answer}>
<span>
<span style="color: #a7a7a7">回答: </span>
{StringUtils.of(answer.answer).nowrap().max(50).toString()}
</span>
</div>
</div>
))}
</div>
))}
</div>
)}

</div>
))}
</div>
Expand Down
13 changes: 12 additions & 1 deletion packages/core/src/components/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -137,8 +137,19 @@ export function createWorkerSetting (
<li>接口: {aw.url}</li>
<li>请求方式: {aw.method}</li>
<li>数据类型: {aw.contentType}</li>
<li>请求类型: {aw.type}</li>
<li>
请求数据:
请求头:
<ul style={{ paddingLeft: '12px' }}>
{Reflect.ownKeys(aw.headers || {}).map((key) => (
<li>
{key.toString()} ={hideToken(aw.headers?.[key.toString()] || '')}
</li>
))}
</ul>
</li>
<li>
请求数据:
<ul style={{ paddingLeft: '12px' }}>
{Reflect.ownKeys(aw.data || {}).map((key) => (
<li>
Expand Down
55 changes: 31 additions & 24 deletions packages/core/src/core/utils/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,44 +112,51 @@ export function waitForRecognize() {
* @param opts 请求参数
*/
export function request(url: string, opts: {
type: 'fetch' | 'GM_xmlhttpRequest',
method?: 'get' | 'post';
headers?: Record<string, string>;
contentType?: 'json' | 'text',
body?: string
}): Promise<string | object> {
return new Promise((resolve, reject) => {
const { contentType = 'json', body, method = 'get', headers = {} } = opts || {};
/** 默认参数 */
const { contentType = 'json', body, method = 'get', headers = {}, type = 'fetch' } = opts || {};
/** 环境变量 */
const env = isInBrowser() ? 'browser' : 'node';

const env = typeof GM_xmlhttpRequest !== 'undefined' ? 'GM' : isInBrowser() ? 'browser' : 'node';

console.log('request', { url, opts, env });

if (env === 'GM') {
// eslint-disable-next-line no-undef
GM_xmlhttpRequest({
method: opts.method?.toLocaleUpperCase() as any || 'GET',
url,
data: JSON.stringify(body || {}),
headers: opts.headers || {},
responseType: 'json',
onload: (response) => {
if (contentType === 'json') {
resolve(JSON.parse(response.responseText));
} else {
resolve(response.responseText);
}
},
onerror: reject
});
/** 如果是跨域模式并且是浏览器环境 */
if (type === 'GM_xmlhttpRequest' && env === 'browser') {
if (typeof GM_xmlhttpRequest !== 'undefined') {
// eslint-disable-next-line no-undef
GM_xmlhttpRequest({
method: opts.method?.toLocaleUpperCase() as any || 'GET',
url,
data: JSON.stringify(body || {}),
headers: opts.headers || {},
responseType: 'json',
onload: (response) => {
if (contentType === 'json') {
resolve(JSON.parse(response.responseText));
} else {
resolve(response.responseText);
}
},
onerror: reject
});
} else {
reject(new Error('GM_xmlhttpRequest is not defined'));
}
} else {
const fet: (...args: any[]) => Promise<Response> = env === 'browser' ? fetch : require('node-fetch').default;
const fet: (...args: any[]) => Promise<Response> = env === 'node' ? require('node-fetch').default : fetch;
fet(url, { contentType, body, method, headers }).then(async (response) => {
if (contentType === 'json') {
resolve(await response.json());
} else {
resolve(await response.text());
}
}).catch(reject);
}).catch((error) => {
reject(new Error(error));
});
}
});
}
119 changes: 71 additions & 48 deletions packages/core/src/core/worker/answer.wrapper.handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ export interface SearchResult {
/** 请求响应内容 */
response: any
data: any
/** 错误数据 */
error?: Error
}

/**
Expand All @@ -30,10 +32,16 @@ export interface AnswererWrapper {
name: string
/** 题库网址 */
homepage?: string
/** 请求数据 */
data?: Record<string, string>
/** 请求方法 */
method: 'post' | 'get'
/** 定义 handler 中的参数类型 */
contentType: 'json' | 'text'
/** 请求模式 */
type: 'fetch' | 'GM_xmlhttpRequest',
/** 附带请求头 */
headers: Record<string, string>,
/**
* 此选项是个字符串, 使用 [Function(string)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function) 构造方法进行解析生成方法
*
Expand Down Expand Up @@ -100,60 +108,75 @@ export async function defaultAnswerWrapperHandler(
const searchResults: SearchResult[] = [];

for (const wrapper of answererWrappers) {
let answers: Answer[] = [];
let response: Response | undefined;
try {
let answers: Answer[] = [];
let response: Response | undefined;

const data = Object.create({});
wrapper.data = wrapper.data || {};
/** 构造一个请求数据 */
Reflect.ownKeys(wrapper.data).forEach((key) => {
if (wrapper.data) {
// 解析data数据
Reflect.set(data, key, resolvePlaceHolder(wrapper.data[key.toString()]));
}
});
/** 解析 url 数据 */
let url = resolvePlaceHolder(wrapper.url);
const data = Object.create({});
wrapper.data = wrapper.data || {};
/** 构造一个请求数据 */
Reflect.ownKeys(wrapper.data).forEach((key) => {
if (wrapper.data) {
// 解析data数据
Reflect.set(data, key, resolvePlaceHolder(wrapper.data[key.toString()]));
}
});
/** 解析 url 数据 */
let url = resolvePlaceHolder(wrapper.url);

/** 请求參數 */
url = wrapper.method === 'post' ? url : url + '?' + new URLSearchParams(data).toString();
// 发送请求
const responseData = await request(url, {
method: wrapper.method,
contentType: wrapper.contentType,
body: wrapper.method === 'post' ? JSON.stringify(data) : undefined
});
/** 从 handler 获取搜索到的题目和回答 */
/** 请求參數 */
url = wrapper.method === 'post' ? url : url + '?' + new URLSearchParams(data).toString();
// 发送请求
const responseData = await request(url, {
method: wrapper.method,
contentType: wrapper.contentType,
body: wrapper.method === 'post' ? JSON.stringify(data) : undefined,
type: wrapper.type,
headers: wrapper.headers
});
/** 从 handler 获取搜索到的题目和回答 */

if (wrapper.handler) {
// eslint-disable-next-line no-new-func
const info = Function(wrapper.handler)()(responseData);
if (info && Array.isArray(info)) {
/** 如果返回一个二维数组 */
if (info.every((item: any) => Array.isArray(item))) {
answers = answers.concat(
info.map((item: any) => ({
question: item[0],
answer: item[1]
}))
);
} else {
answers.push({
question: info[0],
answer: info[1]
});
if (wrapper.handler) {
// eslint-disable-next-line no-new-func
const info = Function(wrapper.handler)()(responseData);
if (info && Array.isArray(info)) {
/** 如果返回一个二维数组 */
if (info.every((item: any) => Array.isArray(item))) {
answers = answers.concat(
info.map((item: any) => ({
question: item[0],
answer: item[1]
}))
);
} else {
answers.push({
question: info[0],
answer: info[1]
});
}
}
}
}

searchResults.push({
url: wrapper.url,
name: wrapper.name,
homepage: wrapper.homepage,
answers,
response,
data: responseData
});
searchResults.push({
url: wrapper.url,
name: wrapper.name,
homepage: wrapper.homepage,
answers,
response,
data: responseData
});
} catch (error) {
console.error('请求失败: ', { error });
searchResults.push({
url: wrapper.url,
name: wrapper.name,
homepage: wrapper.homepage,
answers: [],
response: undefined,
data: undefined,
error: error as any
});
}
}

function resolvePlaceHolder(str: string) {
Expand Down

0 comments on commit 8c970bb

Please sign in to comment.