feat: add 接口请求异步处理

This commit is contained in:
suxiaoxin 2018-04-28 17:02:14 +08:00
parent cd61cd5eef
commit 8d4ba009cd
5 changed files with 43 additions and 12 deletions

View File

@ -1,6 +1,7 @@
### v1.3.13
* 新增通过命令行导入 swagger 接口数据功能
* 接口请求设置新增异步处理特性
### v1.3.12

View File

@ -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;

View File

@ -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>,用户不需要登录就可以访问接口测试结果信息。

View File

@ -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;

View File

@ -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);