PHP發送和接收JSON請求

如今微服務中,不少API因爲須要傳遞的參數較多因此要求用包含全部參數的JSON數據做爲POST請求的請求體來替代FormData傳遞參數的方式,在參數量較多時POST JSON要比POST FormData便於開發和測試,今天咱們就來看一下在PHP中如何發送和接受JOSN POST,以及在Laravel框架中針對JSON Request提供的訪問JSON請求數據的便捷方法。php

PHP發送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);
複製代碼

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 是無效的。laravel

Note: 在 PHP 5.6 以前 php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操做。 不過,依賴於 SAPI 的實現,請求體數據被保存的時候, 它能夠打開另外一個 php://input 數據流並從新讀取。 一般狀況下,這種狀況只是針對 POST 請求,而不是其餘請求方式,好比 PUT 或者 PROPFIND。json

使用Guzzle發送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']
]);
複製代碼

Laravel中接受JSON POST

  1. 使用Request的json()->all()獲取請求體裏的整個JSON
//IN controller
public function recieveJson(Request $request)
{
    $request->json()->all();
    //返回值是一個數組
    //針對前面的請求例子,json方法返回的是數組 ["foo" => "bar"]
    //$request->json()返回的是ParamBage
}
複製代碼
  1. 使用Request的input方法獲取請求中的整個JSON或者具體key的值

發送 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'
}
複製代碼
相關文章
相關標籤/搜索