PHP實現(xiàn)發(fā)送和接收JSON請求
現(xiàn)在微服務(wù)中,很多API由于需要傳遞的參數(shù)較多所以要求用包含所有參數(shù)的JSON數(shù)據(jù)作為POST請求的請求體來替代FormData傳遞參數(shù)的方式,在參數(shù)量較多時POST JSON要比POST FormData便于開發(fā)和測試,今天我們就來看一下在PHP中如何發(fā)送和接受JOSN POST,以及在Laravel框架中針對JSON Request提供的訪問JSON請求數(shù)據(jù)的便捷方法。
PHP發(fā)送JSON POST
$url = "http://example.com/request/post/json";
$data = json_encode(["foo" => "bar"]);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_exec($curl);
curl_close($curl);
PHP接受JSON POST
$data = json_decode(file_get_contents('php://input'), true);
$HTTP_RAW_POST_DATA](http://php.net/manual/zh/reserved.variables.httprawpostdata.php),因為它不依賴于特定的 php.ini 指令。 而且,這樣的情況下 [$HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內(nèi)存。 enctype="multipart/form-data" 的時候 php://input 是無效的。
Note: 在 PHP 5.6 之前 php://input 打開的數(shù)據(jù)流只能讀取一次; 數(shù)據(jù)流不支持 seek 操作。 不過,依賴于 SAPI 的實現(xiàn),請求體數(shù)據(jù)被保存的時候, 它可以打開另一個 php://input 數(shù)據(jù)流并重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。
使用Guzzle發(fā)送JSON請求
很多時候在開發(fā)中我們并不會像上面那樣用php curl庫來發(fā)送請求而是使用開源的Http包,常用的Http package比如 Guzzle都有為發(fā)送JSON請求提供了便捷的方法。
//Guzzle version >= 5
use GuzzleHttp\Client;
$client = new Client();
$response = $client->post('url', [
GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar']
]);
Laravel中接受JSON POST
使用Request的json()->all()獲取請求體里的整個JSON
//IN controller
public function recieveJson(Request $request)
{
$request->json()->all();
//返回值是一個數(shù)組
//針對前面的請求例子,json方法返回的是數(shù)組 ["foo" => "bar"]
//$request->json()返回的是ParamBage
}
使用Request的input方法獲取請求中的整個JSON或者具體key的值
發(fā)送 JSON 請求到Laravel應(yīng)用的時候,只要 Content-Type 請求頭被設(shè)置為 application/json,都可以通過 input 方法獲取 JSON 數(shù)據(jù),還可以通過“.”號解析數(shù)組:
public function laravelRecieveJson(Reuqest $request)
{
$foo = $request->input('foo');//echo $foo => 'bar'
//使用點號獲取內(nèi)嵌數(shù)組key的值
//假設(shè)請求體中的JSON為 {"user": {"name": "kevin", "age": 18}}
$name = $reqeust->input('user.name');//echo $name => 'kevin'
}
相關(guān)文章
在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程
WTForms由Python寫成,為表單而生,提供了很多制作Web表單的實用API,和Flask框架結(jié)合使用效果拔群,這里我們就一起看一下在Python的Flask中使用WTForms表單框架的基礎(chǔ)教程2016-06-06
Python中用memcached來減少數(shù)據(jù)庫查詢次數(shù)的教程
這篇文章主要介紹了Python中用memcached來減少數(shù)據(jù)庫查詢次數(shù)的教程,memcached是一種分布式的內(nèi)存緩存工具,使用后可以減少對硬盤的I/O次數(shù),需要的朋友可以參考下2015-04-04
Python中Playwright?與?pyunit?結(jié)合使用詳解
這篇文章主要介紹了Python中Playwright?與?pyunit?結(jié)合使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
MAC平臺基于Python Appium環(huán)境搭建過程圖解
這篇文章主要介紹了MAC平臺基于Python Appium環(huán)境搭建過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
Python 由字符串函數(shù)名得到對應(yīng)的函數(shù)(實例講解)
下面小編就為大家?guī)硪黄狿ython 由字符串函數(shù)名得到對應(yīng)的函數(shù)(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

