国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

請(qǐng)求和響應(yīng):GET和POST兩者皆可得及超越JSON格式返回

2018-11-21 21:16 更新

1.23.1 請(qǐng)求

把我們后臺(tái)的API想象成一個(gè)函數(shù),那么請(qǐng)求的參數(shù)就是我們的參數(shù)列表;而接口響應(yīng)的數(shù)據(jù)則對(duì)應(yīng)函數(shù)返回的結(jié)果。

對(duì)于請(qǐng)求,正如前面所看到的,我們可以使用$_GET,也可以使用$_POST,也可以?xún)烧叨际褂?,還可以在測(cè)試時(shí)自己指定模擬的請(qǐng)求數(shù)據(jù)包。

或者,在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們還需要根據(jù)自身的需求,跟我們自己的客戶(hù)端作一些約定。如通常地,我們會(huì)要求客戶(hù)端 service參數(shù)必須用GET方式 ,以便服務(wù)器返回500時(shí)定位接口服務(wù)位置。對(duì)此,簡(jiǎn)單的我們把$_POST['service']去掉即可,如在入口文件前面添加:

unset($_POST['service']);   //只接收GET方式的service參數(shù)

(1)在index.php入口處指定數(shù)據(jù)源

很多時(shí)間,不同的項(xiàng)目對(duì)數(shù)據(jù)接收有不同的需求。如簡(jiǎn)單地,如果客戶(hù)端是通過(guò)JSON后再傳遞的話(huà),我們可以這樣在入口處進(jìn)行代碼調(diào)整:

//vim ./index.php

$HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : "{}";
DI()->request = new PhalApi_Request(array_merge($_GET,json_decode($HTTP_RAW_POST_DATA, true))); 

(2)單元測(cè)試時(shí)指定數(shù)據(jù)源

在進(jìn)行單元測(cè)試時(shí),我們需要模擬接口的請(qǐng)求動(dòng)作,也需要提供接口參數(shù)。這時(shí)的參數(shù)的指定更為靈活??赏ㄟ^(guò)以下代碼來(lái)實(shí)現(xiàn),即:

//數(shù)據(jù)源
$data = array(...);

DI()->request = new PhalApi_Request($data);

或者使用PhalApi封裝的測(cè)試類(lèi)來(lái)快速模擬調(diào)用接口:

    public function testIndexByRunner()
    {
        //Step 1. 構(gòu)建請(qǐng)求URL
        $url = 'service=Default.Index&username=dogstar';
        $params = array();

        //Step 2. 執(zhí)行請(qǐng)求  
        $rs = PhalApi_Helper_TestRunner::go($url, $params);

(3)接口數(shù)據(jù)的加密傳送

有時(shí),出于安全性的考慮,項(xiàng)目需要對(duì)請(qǐng)求的接口參數(shù)進(jìn)行對(duì)稱(chēng)加密傳送。這時(shí)可以通過(guò)重載PhalApi_Request::genData()來(lái)輕松實(shí)現(xiàn)。
假設(shè),我們現(xiàn)在需要把全部的參數(shù)base64編碼序列化后通過(guò)_POST['data']來(lái)傳遞,則相應(yīng)的解析代碼如下。

第一步,先定義自己的擴(kuò)展請(qǐng)求類(lèi),在里面完成對(duì)稱(chēng)解析的動(dòng)作:

<?php

class Common_Request extends PhalApi_Request {

    public function genData($data) {
        if (!isset($data) || !is_array($data)) {
            return $_POST; //改成只接收POST
        }

        $postData = isset($data['data']) ? base64_decode($data['data']) : array();
    }
}

第二步,在index.php入口文件中重新注冊(cè)請(qǐng)求類(lèi)(即添加以下代碼):

//重新注冊(cè)request
DI()->request = 'Common_Request'; 

然后,就可以輕松實(shí)現(xiàn)了接口參數(shù)的對(duì)稱(chēng)加密傳送。
至此,你也許已經(jīng)發(fā)現(xiàn):指定數(shù)據(jù)源和對(duì)稱(chēng)加密是可以結(jié)合來(lái)使用的。

1.23.2 響應(yīng)

當(dāng)前默認(rèn)使用JSON的格式返回,但項(xiàng)目需要其他返回格式也是可以的。只需要實(shí)現(xiàn)PhalApi_Response抽象中的formatResult($result)格式化返回結(jié)果,然后也是重新注冊(cè)DI()->response服務(wù)即可。如:

(1)JSONP的返回

在H5頁(yè)面中,我們可能會(huì)需要用到JSONP的返回,所以這里默認(rèn)提供了這種格式的支持。

在入口文件中,添加:

//支持JsonP的返回
if (!empty($_GET['callback'])) {
    DI()->response = new PhalApi_Response_JsonP($_GET['callback']);
}

在接口訪(fǎng)問(wèn)時(shí)再帶上&callback=XXX參數(shù)即可。

這里在創(chuàng)建響應(yīng)服務(wù)時(shí),可以看到是用了回調(diào)函數(shù)的名字進(jìn)行初始化??紤]到會(huì)存在XSS(跨站腳本攻擊),對(duì)回調(diào)函數(shù)要進(jìn)行相應(yīng)的過(guò)濾,可以用黑名單或者白名單的方式。黑名單方式暫時(shí)還沒(méi)提供,白名單相對(duì)簡(jiǎn)單但需要項(xiàng)目自己實(shí)現(xiàn),如:

class Common_JsonP extends PhalApi_Response_JsonP {

    protected function clearXss($callback) {
        return in_array($callback, array('fun1', 'func2', 'func3')) ? $callback : '';
    }
}

(2)其他格式返回

如上面所述,當(dāng)需要返回一種當(dāng)前PhalApi沒(méi)提供的格式時(shí),可以:

  • 1、實(shí)現(xiàn)PhalApi_Response抽象中的formatResult($result)格式化返回結(jié)果
  • 2、重新注冊(cè)DI()->response服務(wù)

這里以擴(kuò)展XML返回格式為例,簡(jiǎn)單說(shuō)明。

首先,添加實(shí)現(xiàn)一個(gè)XML響應(yīng)子類(lèi):

<?php

class Common_Response_XML extends PhalApi_Response {

    protected function formatResult($result) {
        return ArrayToXML::toXml($result);
    }
}

關(guān)于A(yíng)rrayToXML,請(qǐng)查看: 將PHP數(shù)組轉(zhuǎn)成XML

然后,重新注冊(cè):

DI()->response = new Common_Response_XML();

done!

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)