如今微服務中,不少API因爲須要傳遞的參數較多因此要求用包含全部參數的JSON數據做爲POST請求的請求體來替代FormData傳遞參數的方式,在參數量較多時POST JSON要比POST FormData便於開發和測試,今天咱們就來看一下在PHP中如何發送和接受JOSN POST,以及在Laravel框架中針對JSON Request提供的訪問JSON請求數據的便捷方法。php
$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);
$data = json_decode(file_get_contents('php://input'), true);
php://input 是個能夠訪問請求的原始數據的只讀流。 POST 請求的狀況下,最好使用 php://input 來代替$HTTP_RAW_POST_DATA
,由於它不依賴於特定的 php.ini 指令。 並且,這樣的狀況下$HTTP_RAW_POST_DATA
默認沒有填充, 比激活always_populate_raw_post_data
潛在須要更少的內存。 enctype="multipart/form-data" 的時候 php://input 是無效的。Note: 在 PHP 5.6 以前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操做。 不過,依賴於 SAPI 的實現,請求體數據被保存的時候, 它能夠打開另外一個 php://input 數據流並從新讀取。 一般狀況下,這種狀況只是針對 POST 請求,而不是其餘請求方式,好比 PUT 或者 PROPFIND。laravel
不少時候在開發中咱們並不會像上面那樣用php curl庫來發送請求而是使用開源的Http包,經常使用的Http package好比 Guzzle都有爲發送JSON請求提供了便捷的方法。json
//Guzzle version >= 5 use GuzzleHttp\Client; $client = new Client(); $response = $client->post('url', [ GuzzleHttp\RequestOptions::JSON => ['foo' => 'bar'] ]);
Request
的json()->all()
獲取請求體裏的整個JSON//IN controller public function recieveJson(Request $request) { $request->json()->all(); //返回值是一個數組 //針對前面的請求例子,json方法返回的是數組 ["foo" => "bar"] //$request->json()返回的是ParamBage }
發送 JSON 請求到Laravel應用的時候,只要 Content-Type 請求頭被設置爲 application/json
,均可以經過 input
方法獲取 JSON 數據,還能夠經過「.」號解析數組:數組
public function laravelRecieveJson(Reuqest $request) { $foo = $request->input('foo');//echo $foo => 'bar' //使用點號獲取內嵌數組key的值 //假設請求體中的JSON爲 {"user": {"name": "kevin", "age": 18}} $name = $reqeust->input('user.name');//echo $name => 'kevin' }