如今微服務中,不少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 是無效的。laravelNote: 在 PHP 5.6 以前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操做。 不過,依賴於 SAPI 的實現,請求體數據被保存的時候, 它能夠打開另外一個 php://input 數據流並從新讀取。 一般狀況下,這種狀況只是針對 POST 請求,而不是其餘請求方式,好比 PUT 或者 PROPFIND。json
不少時候在開發中咱們並不會像上面那樣用php curl庫來發送請求而是使用開源的Http包,經常使用的Http package好比 Guzzle都有爲發送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 數據,還能夠經過「.」號解析數組:bash
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'
}
複製代碼