狀態(tài)碼
200 OK
如果服務(wù)器接受更新,但是在請(qǐng)求指定內(nèi)容之外做了資源修改,必須響應(yīng)200 OK以及更新的資源實(shí)例,像是向此URL發(fā)出GET請(qǐng)求.
201 Created
如果服務(wù)器需要?jiǎng)?chuàng)建一些資源, 比如創(chuàng)建用戶, 創(chuàng)建用戶數(shù)據(jù), 創(chuàng)建資源, 默認(rèn)API的create方法返回這個(gè)狀態(tài)碼.
301 Moved Permanently
被請(qǐng)求的資源已永久移動(dòng)到新位置, 適用于資源link的變更,服務(wù)器做出兼容API.
400 Bad Request
請(qǐng)求體包含語(yǔ)法錯(cuò)誤, 出現(xiàn)本錯(cuò)誤服務(wù)端應(yīng)該向客戶端發(fā)送出錯(cuò)描述
401 Unauthorized
需要驗(yàn)證用戶身份,如果服務(wù)器就算是身份驗(yàn)證后也不允許客戶訪問(wèn)資源,應(yīng)該響應(yīng) 403 Forbidden, 適用于未登錄檢查
403 Forbidden
服務(wù)器拒絕執(zhí)行
適用于:
服務(wù)到期(比如付費(fèi)的增值服務(wù)等)
因?yàn)槟承┰虿辉试S訪問(wèn)(比如被 ban )
權(quán)限不夠,403 狀態(tài)碼
404 Not Found
找不到目標(biāo)資源
適用于:
需要修改的資源不存在
405 Method Not Allowed
不允許執(zhí)行目標(biāo)方法,響應(yīng)中應(yīng)該帶有 Allow 頭,內(nèi)容為對(duì)該資源有效的 HTTP 方法
406 Not Acceptable
服務(wù)器不支持客戶端請(qǐng)求的內(nèi)容格式(比如客戶端請(qǐng)求 JSON 格式的數(shù)據(jù),但服務(wù)器只能提供 XML 格式的數(shù)據(jù))
409 Conflict
請(qǐng)求操作和資源的當(dāng)前狀態(tài)存在沖突
412 Precondition Failed
服務(wù)器在驗(yàn)證在請(qǐng)求的頭字段中給出先決條件時(shí),沒能滿足其中的一個(gè)或多個(gè)。
主要使用場(chǎng)景在于實(shí)現(xiàn)并發(fā)控制
413 Request Entity Too Large
POST 或者 PUT 請(qǐng)求的消息實(shí)體過(guò)大
422 Unprocessable Entity
請(qǐng)求格式正確,但是由于含有語(yǔ)義錯(cuò)誤,無(wú)法響應(yīng)
適用于:
發(fā)送了非法的資源
428 Precondition Required
要求先決條件,如果想要請(qǐng)求能成功必須滿足一些預(yù)設(shè)的條件
適用于:
缺少了必要的頭信息
500 Internal Server Error
服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況,導(dǎo)致了它無(wú)法完成對(duì)請(qǐng)求的處理。
502 Bad Gateway
作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),從上游服務(wù)器接收到無(wú)效的響應(yīng)。
503 Service Unavailable
由于臨時(shí)的服務(wù)器維護(hù)或者過(guò)載,服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求。這個(gè)狀況是臨時(shí)的,并且將在一段時(shí)間以后恢復(fù)。如果能夠預(yù)計(jì)延遲時(shí)間,那么響應(yīng)中可以包含一個(gè) Retry-After 頭用以標(biāo)明這個(gè)延遲時(shí)間(內(nèi)容可以為數(shù)字,單位為秒;或者是一個(gè) HTTP 協(xié)議指定的時(shí)間格式)。如果沒有給出這個(gè) Retry-After 信息,那么客戶端應(yīng)當(dāng)以處理 500 響應(yīng)的方式處理它。
適用于: 服務(wù)器維護(hù)中
laravel中實(shí)際代碼:
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響應(yīng)數(shù)據(jù)規(guī)范
{
"meta":{
"code": 200,
"message":"success"
},
"data": {
"id":3,
"machine_id":"xxxxxx",
"floating_ip": "xx.xx.xx.xx",
"created_at": "1234567891"
}
}
列表數(shù)據(jù):
{
"meta": {
"code": 200,
"message": "***"
},
"data" :{
"***":"***",//需要返回的其它擴(kuò)展字段
"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"
}
]
}
}
分頁(yè)數(shù)據(jù):
{
"meta": {
"code": 200, //結(jié)果碼,int 型,必需??蛻舳藨?yīng)首先根據(jù)此項(xiàng)結(jié)果進(jìn)行相應(yīng)處理。
"message": "***"
},
"data" :{
"page":{
"limit": 10, //每頁(yè)記錄條數(shù)
"page": 2, //當(dāng)前頁(yè)碼
"total": 280 //總記錄數(shù)
},
"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"
}
]
}
}
格式進(jìn)行反給客戶端,盡可能所有的字段和數(shù)據(jù)格式統(tǒng)一方便前端處理。
安全問(wèn)題
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特別注意以下重要規(guī)則:
參數(shù)名ASCII碼從小到大排序(字典序);
如果參數(shù)的值為空不參與簽名;
參數(shù)名區(qū)分大小寫;
驗(yàn)證調(diào)用返回或主動(dòng)通知簽名時(shí),傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗(yàn)。
接口可能增加字段,驗(yàn)證簽名時(shí)必須支持增加的擴(kuò)展字段
第二步,在stringA最后拼接上key得到stringSignTemp字符串,并對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,再將得到的字符串所有字符轉(zhuǎn)換為大寫,得到sign值signValue。
舉例,假設(shè)傳送的參數(shù)如下:
<?php $id = '380840976'; $author_id = '1000000'; $body = 'test'; $date = gmdate('D, d M Y H:i:s \G\M\T');
第一步:對(duì)參數(shù)按照key=value的格式,并按照參數(shù)名ASCII字典序排序如下:
<?php $stringA="id=".$id."&author_id=".$author_id."&body=".$body."&date=".$date;
第二步:拼接API密鑰并進(jìn)行簽名:
<?php
$stringSignTemp=$stringA."&key=302006259b3c09247ec02edaf64f6a5f"; $sign=strtoupper(MD5($stringSignTemp));
最終得到最終發(fā)送的數(shù)據(jù)
2.發(fā)送請(qǐng)求
將上一步生成的簽名,放到 HTTP 消息頭中。如果沒有簽名或者簽名錯(cuò)誤,則會(huì)導(dǎo)致接口調(diào)用失敗,服務(wù)端會(huì)返回 HTTP 狀態(tài)碼 401
格式如下:
<?php
$headers = [ "Date: ".$date, // header 中使用的時(shí)間必須和生成簽名的時(shí)間$date相同 "Authorization: $appid:".$sign,//$appid 為開發(fā)者申請(qǐng)的appid ];
$body = [ 'id'=>$id, 'author_id'=>$author_id, 'body'=>$body, 'date'=>$date, ]; $response =Request::post("http://api.yuan6696top.com/", $headers, $body); $response->body;
3.回調(diào)API安全
在普通的網(wǎng)絡(luò)環(huán)境下,HTTP請(qǐng)求存在DNS劫持、運(yùn)營(yíng)商插入廣告、數(shù)據(jù)被竊取,正常數(shù)據(jù)被修改等安全風(fēng)險(xiǎn)。用戶回調(diào)接口使用HTTPS協(xié)議可以保證數(shù)據(jù)傳輸?shù)陌踩?。所以建議用戶回調(diào)采用HTTPS協(xié)議。
原文參考:http://www.chen2016php.com/a/MVCkuangjiazhishihuizong/laravel/2017/1019/204.html