BASH - REST-API - JSON封装(上)
BASH语言本身作为脚本语言, 功能比较强大.但是语法又特别弱.
有时候我们需要对程序的接口函数进行标准封装. 比如一般的 shell函数的返回值只有 exit code
和 stdout
两种. 但是我们想要得到一般意义的函数返回 ApiResponse的时候. 这个时候怎么办呢. 这篇文章就是一个基本的技巧.
常规 bash function 返回处理
我们关心返回状态的时候
以下是一段常见的代码封装, 如果是要看函数的返回状态. 我们可以直接读取$?
变量的值就可以了.
注:
$?
保存着上一次子shell / 函数 的退出状态. 如果函数执行没有显示的书写:return xxx
则默认返回0- 函数的return code 取值只有
0 - 255
function test_hello(){
if [[ "$1" -eq 1 ]];then
echo "yes"
return 0;
fi
echo "no";
return 1;
}
test_hello 1
echo "return code:$?"
test_hello 0
echo "return code:$?"
我们只关心返回值的时候
这个时候,一般处理是把函数放到子shell中运行. 我们可以使用``
, 或者$()
把执行语句(包括函数调用) 放到一个临时的子shell上运行. 此时的stdout将会被捕获. 这个时候捕获的值我们赋值给变量: return1
或者return2
function test_hello(){
if [[ "$1" -eq 1 ]];then
echo "yes"
return 0;
fi
echo "no";
return 1;
}
return1=`test_hello 1`
echo "return value:$return1"
return2=`test_hello 0`
echo "return value:$return2"
既要返回值,也想要返回状态
这个时候也不是不可能实现, 上面的两种处理分别处理了返回code和返回值. 我们也可以把他们结合起来. 让一个函数返回两次. 就像下面这样.
function test_hello(){
if [[ "$1" -eq 1 ]];then
echo "yes"
return 0;
fi
echo "no";
return 1;
}
return1=`test_hello 1`
echo "return code:$?,value=${return1}"
return2=`test_hello 0`
echo "return code:$?,value=${return2}"
虽然不是很方便. 但是基本也实现了我们的目标. 就是不太方便的是一个函数的返回数据 要分别从两个不同的地方取,一个是exit code一个是 stdout , 就像最开始我们说的那样. 而且 $?
这是一个临时变量, 如果不及时保存的话可能被后面的语句执行结果覆盖. 一般需要马上用一个临时变量保存起来. 比如下面的代码
function test_return_code()
{
return 2
}
test_return_code
echo "return_code:$?"
echo "return_code:$?"
将会得到输出,这是因为第二行的语句在打印$?
的时候, $?
已经被上一句的执行语句echo
的返回结果覆盖. 所以要用返回值的时候就必须马上把其值保存起来.
return_code:2
return_code:0
REST风格JSON API返回封装
如果说,我们想要一个标准JSON结构的返回, 这样我们就可以像JAVA API一样把return code和msg以及data一起从标准返回(对于shell来说就只有标准的输出了). 比如:
返回数据的标准Json:
{
"ret": true,
"errmsg": "this is error msg",
"errcode": 0,
"data": {
"A": {
"a": "b"
},
"B": "2y",
"c": true,
"d": 12346
}
}
在使用上,我们想要的效果是:
API_RESPONSE_RETURN '{"ret":true,"errmsg":"this is errorMsg","errorcode": 0}'
API_RESPONSE_RETURN true "$data"
API_RESPONSE_RETURN false "$msg"
这个时候,我们不再依赖 exit code来判定函数的返回状态了. 所有的数据都变成一个标准的JSON输出. 这样调用方就可以很方便的获取函数的返回状态与数据了. 具体怎么实现, 我们在BASH - REST-API - JSON封装(下)中具体介绍.