BASH - REST-API - JSON封装(上)

  |   0 评论   |   1,219 浏览

BASH语言本身作为脚本语言, 功能比较强大.但是语法又特别弱.

有时候我们需要对程序的接口函数进行标准封装. 比如一般的 shell函数的返回值只有 exit codestdout两种. 但是我们想要得到一般意义的函数返回 ApiResponse的时候. 这个时候怎么办呢. 这篇文章就是一个基本的技巧.

常规 bash function 返回处理

我们关心返回状态的时候

以下是一段常见的代码封装, 如果是要看函数的返回状态. 我们可以直接读取$?变量的值就可以了.

注:

  1. $? 保存着上一次子shell / 函数 的退出状态. 如果函数执行没有显示的书写: return xxx 则默认返回0
  2. 函数的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封装(下)中具体介绍.

评论

发表评论


取消