api开发规范

状态码

200 OK
如果服务器接受更新,但是在请求指定内容之外做了资源修改,必须响应200 OK以及更新的资源实例,像是向此URL发出GET请求.

201 Created
如果服务器需要创建一些资源, 比如创建用户, 创建用户数据, 创建资源, 默认API的create方法返回这个状态码.

301 Moved Permanently
被请求的资源已永久移动到新位置, 适用于资源link的变更,服务器做出兼容API.

400 Bad Request
请求体包含语法错误, 出现本错误服务端应该向客户端发送出错描述

401 Unauthorized
需要验证用户身份,如果服务器就算是身份验证后也不允许客户访问资源,应该响应 403 Forbidden, 适用于未登录检查

403 Forbidden
服务器拒绝执行

适用于:
服务到期(比如付费的增值服务等)
因为某些原因不允许访问(比如被 ban )
权限不够,403 状态码

404 Not Found
找不到目标资源

适用于:
需要修改的资源不存在

405 Method Not Allowed
不允许执行目标方法,响应中应该带有 Allow 头,内容为对该资源有效的 HTTP 方法

406 Not Acceptable
服务器不支持客户端请求的内容格式(比如客户端请求 JSON 格式的数据,但服务器只能提供 XML 格式的数据)

409 Conflict
请求操作和资源的当前状态存在冲突

412 Precondition Failed
服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。
主要使用场景在于实现并发控制

413 Request Entity Too Large
POST 或者 PUT 请求的消息实体过大

422 Unprocessable Entity
请求格式正确,但是由于含有语义错误,无法响应

适用于:
发送了非法的资源

428 Precondition Required
要求先决条件,如果想要请求能成功必须满足一些预设的条件
适用于:
缺少了必要的头信息

500 Internal Server Error
服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503 Service Unavailable
由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间(内容可以为数字,单位为秒;或者是一个 HTTP 协议指定的时间格式)。如果没有给出这个 Retry-After 信息,那么客户端应当以处理 500 响应的方式处理它。
适用于: 服务器维护中

laravel中实际代码:

public function returnCode($code,$message='',$data='')
{
    switch ($code) {
        case 200:
            $msg = 'OK';
            break;
        case 201:
            $msg = 'Created';
            break;
        case 400:
            $msg = 'Bad Request';
            break;
        case 401:
            $msg = 'Unauthorized';
            break;
        case 404:
            $msg = 'Not Found';
            break;
        case 408:
            $msg = 'Request Time-out';
            break;
        case 409:
            $msg = 'Conflict';
            break;
        case 500:
            $msg = 'Internal Server Error';
            break;
        case 503:
            $msg = 'Service Unavailable';
            break;
        default:
            break;
    }
    if($message != '') {
        $message = $msg.':'.$message;
    } else {
        $message = $msg;
    }

    $result = [
        'meta'=>[
            'code'=>$code,
            'message'=>$message,
        ],
        
    ];
    if($data !='') {
        $result = array_add($result,'data',$data);
    }
    return $result;     

}

APi响应数据规范

{
    "meta":{
        "code": 200, 
        "message":"success"
    },
    "data": {
         "id":3,
         "machine_id":"xxxxxx",
         "floating_ip": "xx.xx.xx.xx",
         "created_at": "1234567891"
     }
}

列表数据:

{
    "meta": {
        "code": 200,    
        "message": "***"
    },

    "data" :{

        "***":"***",//需要返回的其它扩展字段

        "items":[
            {
                "id":1,
                "machin_id":"xxxxxx",
                "floating_ip": "xx.xx.xx.xx",
                "created_at": "1234567891"
            },
            {
                "id":2,
                "machin_id":"xxxxxx",
                "floating_ip": "xx.xx.xx.xx",
                "created_at": "1234567891"

            }

        ]
    }


}

分页数据:

{
"meta": {
    "code": 200,   //结果码,int 型,必需。客户端应首先根据此项结果进行相应处理。
    "message": "***"
},

"data" :{
    "page":{
        "limit": 10,    //每页记录条数
        "page": 2,    //当前页码
        "total": 280 //总记录数

    },
    "items":[
        {
            "id":1,
             "machin_id":"xxxxxx",
             "floating_ip": "xx.xx.xx.xx",
            "created_at": "Fri Aug 22 00:00:00 +0800 2014"
        },
        {
            "id":2,
            "machin_id":"xxxxxx",
            "floating_ip": "xx.xx.xx.xx",
            "created_at": "Fri Aug 21 00:00:00 +0800 2014"

        }

    ]
}


}

格式进行反给客户端,尽可能所有的字段和数据格式统一方便前端处理。

安全问题

签名生成的通用步骤如下:

第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特别注意以下重要规则:

参数名ASCII码从小到大排序(字典序);
如果参数的值为空不参与签名;
参数名区分大小写;
验证调用返回或主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
接口可能增加字段,验证签名时必须支持增加的扩展字段

第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

举例,假设传送的参数如下:

<?php $id = '380840976'; $author_id = '1000000'; $body = 'test'; $date = gmdate('D, d M Y H:i:s \G\M\T');

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

    <?php $stringA="id=".$id."&author_id=".$author_id."&body=".$body."&date=".$date;
第二步:拼接API密钥并进行签名:

<?php 
$stringSignTemp=$stringA."&key=302006259b3c09247ec02edaf64f6a5f"; $sign=strtoupper(MD5($stringSignTemp));

最终得到最终发送的数据

2.发送请求

将上一步生成的签名,放到 HTTP 消息头中。如果没有签名或者签名错误,则会导致接口调用失败,服务端会返回 HTTP 状态码 401

格式如下:

<?php 
$headers = [ "Date: ".$date, // header 中使用的时间必须和生成签名的时间$date相同 "Authorization: $appid:".$sign,//$appid 为开发者申请的appid ];
 $body = [ 'id'=>$id, 'author_id'=>$author_id, 'body'=>$body, 'date'=>$date, ]; $response =Request::post("http://api.yuan6696top.com/", $headers, $body); $response->body;

3.回调API安全
在普通的网络环境下,HTTP请求存在DNS劫持、运营商插入广告、数据被窃取,正常数据被修改等安全风险。用户回调接口使用HTTPS协议可以保证数据传输的安全性。所以建议用户回调采用HTTPS协议。

原文参考:http://www.chen2016php.com/a/MVCkuangjiazhishihuizong/laravel/2017/1019/204.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容