PHP发送和接收JSON请求
现在微服务中,很多API由于需要传递的参数较多所以要求用包含所有参数的JSON数据作为POST请求的请求体来替代FormData传递参数的方式,在参数量较多时POST JSON要比POST FormData便于开发和测试,今天我们就来看一下在PHP中如何发送和接受JOSN POST,以及在Laravel框架中针对JSON Request提供的访问JSON请求数据的便捷方法。
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 是无效的。Note: 在 PHP 5.6 之前 php://input 打开的数据流只能读取一次; 数据流不支持 seek 操作。 不过,依赖于 SAPI 的实现,请求体数据被保存的时候, 它可以打开另一个 php://input 数据流并重新读取。 通常情况下,这种情况只是针对 POST 请求,而不是其他请求方式,比如 PUT 或者 PROPFIND。
使用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
- 使用
Request
的json()->all()
获取请求体里的整个JSON
//IN controller public function recieveJson(Request $request) { $request->json()->all(); //返回值是一个数组 //针对前面的请求例子,json方法返回的是数组 ["foo" => "bar"] //$request->json()返回的是ParamBage }
- 使用Request的input方法获取请求中的整个JSON或者具体key的值
发送 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' }
相关推荐
wmsjlihuan 2020-09-15
shishengsoft 2020-09-15
83911535 2020-11-13
zyyjay 2020-11-09
xuebingnan 2020-11-05
samtrue 2020-11-22
stefan0 2020-11-22
yifangs 2020-10-13
songshijiazuaa 2020-09-24
hebiwtc 2020-09-18
天步 2020-09-17
whatsyourname 2020-11-13
zhouyuqi 2020-11-10
Noneyes 2020-11-10
mathchao 2020-10-28
王志龙 2020-10-28
wwwsurfphpseocom 2020-10-28