阅读(4143) (1)

API开发

2017-05-29 23:44:34 更新

ApiAdmin支持在其基础上直接二次开发Api,这篇文章将详细的说明Api开发的步骤。

声明

新增接口

要想让接口被系统接受,我们需要在后台添加接口。所有的接口访问都必须根据系统自动给出的hash来请求

新增接口

字段名称 说明 备注
接口名称 接口所映射的真实类和方法 类名/方法名【注意区分大小写】
请求方式 GET/POST/不限 这里将不会限制请求方法,但是如果选择GET那么POST的参数会收不到
接口映射 用于请求接口使用 系统自动生成
AccessToken 忽略Token/验证Token 接口请求是否需要验证AccessToken
用户登录 忽略登录/验证登录 是否验证UserToken
测试调试 关闭测试/开启测试 当开启测试的时候,系统不会验证AccessToken,也不会过滤数据,也不会规整输出数据,但是当你传递了UserToken的时候,系统还是会验证UserToken的合法性。
应用描述 表明应用的作用 用于文档显示

请求参数

当关闭了测试的时候,ApiAdmin会根据请求参数过滤用户的输入参数,所以,如果不配置请求参数,那么你会获取不到任何请求参数。

请求参数

字段名称 说明 备注
字段名称 请求的字段名 区分大小写
数据类型 自动处理用户输入的数据类型
默认值 如果当前字段是不必填项,系统会自动将默认值赋值给指定字段
是否必填 选择必填,如果没有传参,系统会报错
规则细节 支持JSON字符串 需要配合字符类型使用
字段说明 用于文档显示

字符类型 规则示例 说明
Integer {"min":1,"max":10} 大于1,并且小于10,可以只设置下限或者只设置上限
String {"min":1,"max":10} 字符串长度小于10,并且大于1,可以只设置下限或者只设置上限
Enum [0,1,2] 只能取值0,1,2别的都不可以
Float {"min":1,"max":10} 大于1,并且小于10,可以只设置下限或者只设置上限
Mobile 必须是合法的11位手机号
Array {"min":1,"max":10} 数组长度大于1并且小于10,可以只设置下限或者只设置上限

返回参数

系统不会过滤返回参数,所以开发者在做数据返回的时候一定要处理好字段,但是系统会自动处理返回的参数的字符类型。不过一定要配置好返回参数。

返回参数

返回参数的配置相对较为简单,只需要将返回的数据上传即可!

上传数据

完成数据上传,系统会自动判断数据类型以及字段层级,但是有以下几点需要注意:

  • 在配置接口参数的时候,连接口都没有,怎么会有返回数据?对于这个先有鸡还是先有蛋的问题,不做讨论,建议开发接口的时候将测试模式打开,然后开发完成,获取到数据的时候再提交。
  • 系统自动判断数据类型, 对于手机号码类型的判断有错误,应该是String类型,系统给出的是Integer类型,需要手动修改。
  • 如果想要让Api文档变的更加丰满,需要单独配置字段说明(一个个配置哦)。
  • 如果修改返回字段的时候,只能通过上传来覆盖原先的配置,系统会自动将字段名称(字段名和字段层级)一样的,不做变更,但是把不存在的字段名删去,同时新增多出来的字段。

开始写代码

前几步的配置,基本保证了API的接入,下面将是对API逻辑的处理,打开项目代码找到/Application/Home/Api/,接下来Api逻辑将写在这里。

接下来我们将以获取AccessToken为例来阐述API的编写方法。

  1. 创建BuildToken.class.php,必须严格注意大小写,同时得带上.class。
  2. 编写代码逻辑。
    
    <?php
    /**
    * 和Token相关的全部接口
    * @since   2017/03/02 创建
    * @author  zhaoxiang <zhaoxiang051405@gmail.com>
    */
    namespace Home\Api;
    use Admin\Model\ApiAppModel;
    use Home\ORG\ApiLog;
    use Home\ORG\Crypt;
    use Home\ORG\Response;
    use Home\ORG\ReturnCode;
    class BuildToken extends Base {
    public function getAccessToken($param) {
        if (empty($param['app_id'])) {
            Response::error(ReturnCode::EMPTY_PARAMS, '缺少app_id');
        }
        $appObj = new ApiAppModel();
        $appInfo = $appObj->where(array('app_id' => $param['app_id'], 'app_status' => 1))->find();
        if (empty($appInfo)) {
            Response::error(ReturnCode::INVALID, '应用ID非法');
        }
        $crypt = new Crypt();
        $signature = $param['signature'];
        unset($param['signature']);
        $sign = $crypt->getAuthToken($appInfo['app_secret'], $param);
        Response::debug($sign);
        if ($sign !== $signature) {
            Response::error(ReturnCode::INVALID, '身份令牌验证失败');
        }
        $expires = C('ACCESS_TOKEN_EXPIRES');
        $accessToken = S($param['device_id']);
        if ($accessToken) {
            S($accessToken, null);
            S($param['device_id'], null);
        }
        $accessToken = $crypt->getAccessToken($appInfo['app_id'], $appInfo['app_secret']);
        $appInfo['device_id'] = $param['device_id'];
        ApiLog::setAppInfo($appInfo);
        S($accessToken, $appInfo, $expires);
        S($param['device_id'], $accessToken, $expires);
        $return['access_token'] = $accessToken;
        $return['expires_in'] = $expires;

return $return; } }


> 注意:上面我们在新增接口的时候,填写的接口名称为`BuildToken/getAccessToken`,所以现在的类名称必须为`BuildToken`,而方法名称必须为`getAccessToken`。


代码中有几点需要说明:
- `public function getAccessToken($param)`,这里的`$param`就是一个参数名称,你可以任意命名,同时`$param`是系统处理过的用户输入参数。
- 当你处理完逻辑,直接`return`数组就好了,系统会自动捕获你返回的数组,并且做后期处理。


### 最后说明
到这里,获取AccessToken的接口就全部开发完成了,还有几点需要阐明:
1. 错误输出使用Response::error();
2. 请使用PostMan测试接口,明确Header参数和GET/POST参数。
3. 请查看http://localhost/wikiList.html获取API文档。
4. 请查看http://localhost/calculation.html获取身份令牌计算算法。
5. 请查看http://localhost/errorList.html获取错误码细节。