日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...

發布時間:2023/12/15 php 33 豆豆

1.23.1 請求

把我們后臺的API想象成一個函數,那么請求的參數就是我們的參數列表;而接口響應的數據則對應函數返回的結果。

對于請求,正如前面所看到的,我們可以使用$_GET,也可以使用$_POST,也可以兩者都使用,還可以在測試時自己指定模擬的請求數據包。

或者,在實際項目開發中,我們還需要根據自身的需求,跟我們自己的客戶端作一些約定。如通常地,我們會要求客戶端 service參數必須用GET方式 ,以便服務器返回500時定位接口服務位置。對此,簡單的我們把$_POST['service']去掉即可,如在入口文件前面添加:

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

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

很多時間,不同的項目對數據接收有不同的需求。如簡單地,強制統一使用$_POST參數,我們可以這樣在入口處進行代碼調整:

//vim ./index.php

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

對于復雜的情況,如需要使用post_raw數據,則可以繼承PhalApi_Request實現相應的數據源解析。如:

class My_Request extends PhalApi_Request{

public function __construct($data = NULL) {

parent::__construct($data);

// json處理

$this->post = json_decode(file_get_contents('php://input'), TRUE);

// 普通xml處理

$this->post = simplexml_load_string (

file_get_contents('php://input'),

'SimpleXMLElement',

LIBXML_NOCDATA

);

$this->post = json_decode(json_encode($this->post), TRUE);

}

}

然后在子類實現對各類參數的數據源的準備。可以說,PhalApi_Request::__construct()構造函數用于初始化各類輔助侯選的數據源,而PhalApi_Request::getData()則用于生成主要默認的數據源。

(2) 單元測試時指定數據源

在進行單元測試時,我們需要模擬接口的請求動作,也需要提供接口參數。這時的參數的指定更為靈活。可通過以下代碼來實現,即:

//數據源

$data = array(...);

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

或者使用PhalApi封裝的測試類來快速模擬調用接口:

public function testIndexByRunner()

{

//Step 1. 構建請求URL

$url = 'service=Default.Index&username=dogstar';

$params = array();

//Step 2. 執行請求

$rs = PhalApi_Helper_TestRunner::go($url, $params);

}

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

有時,出于安全性的考慮,項目需要對請求的接口參數進行對稱加密傳送。這時可以通過重載PhalApi_Request::genData()來輕松實現。

假設,我們現在需要把全部的參數base64編碼序列化后通過$_POST['data']來傳遞,則相應的解析代碼如下。

第一步,先定義自己的擴展請求類,在里面完成對稱解析的動作:

class Common_Request extends PhalApi_Request {

public function genData($data) {

if (!isset($data) || !is_array($data)) {

$data = $_POST; //改成只接收POST

}

return isset($data['data']) ? base64_decode($data['data']) : array();

}

}

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

//重新注冊request

DI()->request = 'Common_Request';

然后,就可以輕松實現了接口參數的對稱加密傳送。

至此,你也許已經發現:指定數據源和對稱加密是可以結合來使用的。

(4) 接口參數級別的數據源

除了可以指定全局的接口數據源外,還可以進行更細致的配置,即為某個接口參數指定使用$GET、$_POST、$_COOKIE、$_SERVER、$_REQUEST或頭部等其他數據源。

其使用方式是在配置接口參數規則時,使用source配置來指定當前參數的數據源,如指定用戶在登錄時,用戶名使用$_GET、密碼使用$_POST。

public function getRules() {

return array(

'login' => array(

'username' => array('name' => 'username', 'source' => 'get'),

'password' => array('name' => 'password', 'source' => 'post'),

),

);

}

這樣,PhalApi框架就會從$_GET中提取username參數,從$_POST中提取password參數。

目前支持的source與對應的數據源映射關系如下:

source

對應的數據源

post

$_POST

get

$_GET

cookie

$_COOKIE

server

$_SERVER

requset

$_REQUEST

header

$_SERVER['HTTP_X']

因此,這樣就可以輕松、更自由獲取不同來源的參數。以下是一些常用的配置示例。

// 獲取HTTP請求方法,判斷是POST還是GET

'method' => array('name' => 'REQUEST_METHOD', 'source' => 'server'),

// 獲取COOKIE中的標識

'is_new_user' => array('name' => 'is_new_user', 'source' => 'cookie'),

// 獲取HTTP頭部中的編碼,判斷是否為utf-8

'charset' => array('name' => 'Accept-Charset', 'source' => 'header'),

若需要擴展項目自定義的映射關系,則可以重載PhalApi_Request::getDataBySource($source)方法,如:

class My_Request extends PhalApi_Request {

protected function &getDataBySource($source) {

if (strtoupper($source) == 'stream') {

// TODO 處理二進制流

}

return parent::getDataBySource($source);

}

}

然后,便可在項目中這樣配置使用二進制流的數據源。

// 從二進制流中獲取密碼

'password' => array('name' => 'password', 'source' => 'stream'),

若配置的source為無效或非法時,則會拋出異常。

如故意配置一個錯誤的數據源source為NOT_FOUND。

'password' => array('name' => 'password', 'source' => 'NOT_FOUND'),

在請求接口時,會遇到這樣的異常提示返回。

{

"ret": 500,

"data": [],

"msg": "服務器運行錯誤: 參數規則中未知的數據源:NOT_FOUND"

}

溫馨提示:以上功能需要PhalApi 1.4.0 及以上版本支持。

1.23.2 響應

當前默認使用JSON的格式返回,但項目需要其他返回格式也是可以的。只需要實現PhalApi_Response抽象中的formatResult($result)格式化返回結果,然后也是重新注冊DI()->response服務即可。如:

(1) JSONP的返回

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

在入口文件中,添加:

//支持JsonP的返回

if (!empty($_GET['callback'])) {

DI()->response = new PhalApi_Response_JsonP($_GET['callback']);

}

在接口訪問時再帶上&callback=XXX參數即可。

這里在創建響應服務時,可以看到是用了回調函數的名字進行初始化。考慮到會存在XSS(跨站腳本攻擊),對回調函數要進行相應的過濾,可以用黑名單或者白名單的方式。黑名單方式暫時還沒提供,白名單相對簡單但需要項目自己實現,如:

class Common_JsonP extends PhalApi_Response_JsonP {

protected function clearXss($callback) {

return in_array($callback, array('fun1', 'func2', 'func3')) ? $callback : '';

}

}

(2) 其他格式返回

如上面所述,當需要返回一種當前PhalApi沒提供的格式時,可以:

1、實現PhalApi_Response抽象中的formatResult($result)格式化返回結果

2、重新注冊DI()->response服務

這里以擴展XML返回格式為例,簡單說明。

首先,添加實現一個XML響應子類:

class Common_Response_XML extends PhalApi_Response {

protected function formatResult($result) {

return ArrayToXML::toXml($result);

}

}

關于ArrayToXML,請查看: 將PHP數組轉成XML

然后,重新注冊:

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

done!

總結

以上是生活随笔為你收集整理的php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。