mirror of
https://github.com/YMFE/yapi.git
synced 2025-04-06 15:00:26 +08:00
feat: add 接口请求异步处理
This commit is contained in:
parent
cd61cd5eef
commit
8d4ba009cd
@ -1,6 +1,7 @@
|
||||
### v1.3.13
|
||||
|
||||
* 新增通过命令行导入 swagger 接口数据功能
|
||||
* 接口请求设置新增异步处理特性
|
||||
|
||||
### v1.3.12
|
||||
|
||||
|
@ -129,12 +129,14 @@ function sandboxByNode(sandbox={}, script){
|
||||
return sandbox;
|
||||
}
|
||||
|
||||
function sandbox(context={}, script){
|
||||
async function sandbox(context={}, script){
|
||||
|
||||
if(isNode){
|
||||
try{
|
||||
context.context = context;
|
||||
context.console = console;
|
||||
context.Promise = Promise;
|
||||
context.setTimeout = setTimeout;
|
||||
context = sandboxByNode(context, script)
|
||||
}catch(err){
|
||||
err.message = `Script: ${script}
|
||||
@ -144,6 +146,15 @@ function sandbox(context={}, script){
|
||||
}else{
|
||||
context = sandboxByBrowser(context, script)
|
||||
}
|
||||
if(context.promise && typeof context.promise === 'object' && context.promise.then){
|
||||
try{
|
||||
await context.promise
|
||||
}catch(err){
|
||||
err.message = `Script: ${script}
|
||||
message: ${err.message}`
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
return context;
|
||||
|
||||
|
||||
@ -179,6 +190,7 @@ async function crossRequest(defaultOptions, preScript, afterScript) {
|
||||
query: query,
|
||||
requestHeader: options.headers || {},
|
||||
requestBody: options.data,
|
||||
promise: false,
|
||||
utils: {
|
||||
_: _,
|
||||
base64: utils.base64,
|
||||
@ -188,12 +200,13 @@ async function crossRequest(defaultOptions, preScript, afterScript) {
|
||||
sha256: utils.sha256,
|
||||
sha384: utils.sha384,
|
||||
sha512: utils.sha512,
|
||||
unbase64: utils.unbase64
|
||||
unbase64: utils.unbase64,
|
||||
axios: axios
|
||||
}
|
||||
};
|
||||
|
||||
if (preScript) {
|
||||
context = sandbox(context, preScript);
|
||||
context = await sandbox(context, preScript);
|
||||
defaultOptions.url = options.url = URL.format({
|
||||
protocol: urlObj.protocol,
|
||||
host: urlObj.host,
|
||||
@ -237,7 +250,7 @@ async function crossRequest(defaultOptions, preScript, afterScript) {
|
||||
context.responseHeader = data.res.header;
|
||||
context.responseStatus = data.res.status;
|
||||
context.runTime = data.runTime;
|
||||
context = sandbox(context, afterScript);
|
||||
context = await sandbox(context, afterScript);
|
||||
data.res.body = context.responseData;
|
||||
data.res.header = context.responseHeader;
|
||||
data.res.status = context.responseStatus;
|
||||
|
@ -148,9 +148,30 @@ context.utils = {
|
||||
sha384 //转换字符串为 sha384 编码
|
||||
sha512 //转换字符串为 sha512 编码
|
||||
unbase64 //转换 base64 编码为字符串
|
||||
axios // axios 库,可用于 api 请求,官网 https://github.com/axios/axios
|
||||
}
|
||||
```
|
||||
|
||||
### 异步处理(v1.3.13+支持)
|
||||
|
||||
处理请求参数,或返回数据,可能还会涉及到异步处理,比如 ajax 请求,YApi 在 v1.3.13 版本支持了异步处理。
|
||||
|
||||
```javascript
|
||||
context.promise = new Promise(function(resolve){
|
||||
var api = context.utils.axios.get('http://yapi.local.qunar.com:3000/api/user/status')
|
||||
api.then(function(result){
|
||||
//...
|
||||
console.log(result.data)
|
||||
resolve()
|
||||
})
|
||||
|
||||
})
|
||||
```
|
||||
|
||||
使用方法就是在 `context` 里面添加 `promise` 参数,并且返回一个 Promise,不熟悉 Promise 的童鞋可以查下相关用法,ajax 请求可以使用 `context.utils.axios` 库。
|
||||
|
||||
> 处理完成后,不要忘记 `resolve()`,不然会一直处于挂起状态
|
||||
|
||||
## token配置
|
||||
|
||||
每个项目都有唯一的标识token,用户可以使用这个token值来请求项目的所有资源数据。目前用到的地方是接口的<a href="./case.md">自动化测试</a>,用户不需要登录就可以访问接口测试结果信息。
|
||||
|
@ -31,7 +31,7 @@ class baseController {
|
||||
'/api/user/login_by_ldap'
|
||||
];
|
||||
//let openApiRouter = /^\/api\/open\/.*/
|
||||
if (ignoreRouter.indexOf(ctx.path) === 0) {
|
||||
if (ignoreRouter.indexOf(ctx.path) > -1) {
|
||||
this.$auth = true;
|
||||
}
|
||||
// else if(openApiRouter.test(ctx.path)){
|
||||
@ -50,7 +50,7 @@ class baseController {
|
||||
'/api/interface/add_cat'
|
||||
]
|
||||
let token = ctx.query.token || ctx.request.body.token;
|
||||
if(token && openApiRouter.indexOf(ctx.path) > 0){
|
||||
if(token && openApiRouter.indexOf(ctx.path) > -1){
|
||||
if(this.$auth){
|
||||
ctx.params.project_id = await this.getProjectIdByToken(token)
|
||||
this.$tokenAuth = true;
|
||||
|
@ -37,6 +37,7 @@ class openController extends baseController{
|
||||
runAutoTest: {
|
||||
'*id': 'number',
|
||||
'env_name': 'string',
|
||||
'project_id': "string",
|
||||
'token': 'string',
|
||||
'mode' : {
|
||||
type: 'string',
|
||||
@ -123,6 +124,7 @@ class openController extends baseController{
|
||||
}
|
||||
|
||||
async runAutoTest(ctx){
|
||||
const projectId = ctx.params.project_id;
|
||||
const startTime = new Date().getTime();
|
||||
const records = this.records = {};
|
||||
const reports = this.reports = {};
|
||||
@ -134,12 +136,6 @@ class openController extends baseController{
|
||||
return ctx.body = yapi.commons.resReturn(null, 40022, 'id值不存在');
|
||||
}
|
||||
|
||||
let checkId = await this.getProjectIdByToken(token);
|
||||
|
||||
let projectId = colData.project_id;
|
||||
if(checkId !== projectId){
|
||||
return ctx.body = yapi.commons.resReturn(null, 40033, '没有权限');
|
||||
}
|
||||
let projectData = await this.projectModel.get(projectId);
|
||||
|
||||
let caseList = await yapi.commons.getCaseList(id);
|
||||
|
Loading…
x
Reference in New Issue
Block a user