PHP实现发送和接收JSON请求
现在微服务中,很多API由于需要传递的参数较多所以要求用包含所有参数的JSON数据作为POST请求的请求体来替代FormData传递参数的方式,在参数量较多时POSTJSON要比POSTFormData便于开发和测试,今天我们就来看一下在PHP中如何发送和接受JOSNPOST,以及在Laravel框架中针对JSONRequest提供的访问JSON请求数据的便捷方法。
PHP发送JSONPOST
$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接受JSONPOST
$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潜在需要更少的内存。enctype="multipart/form-data"的时候php://input是无效的。
Note:在PHP5.6之前php://input打开的数据流只能读取一次;数据流不支持seek操作。不过,依赖于SAPI的实现,请求体数据被保存的时候,它可以打开另一个php://input数据流并重新读取。通常情况下,这种情况只是针对POST请求,而不是其他请求方式,比如PUT或者PROPFIND。
使用Guzzle发送JSON请求
很多时候在开发中我们并不会像上面那样用phpcurl库来发送请求而是使用开源的Http包,常用的Httppackage比如Guzzle都有为发送JSON请求提供了便捷的方法。
//Guzzleversion>=5 useGuzzleHttp\Client; $client=newClient(); $response=$client->post('url',[ GuzzleHttp\RequestOptions::JSON=>['foo'=>'bar'] ]);
Laravel中接受JSONPOST
使用Request的json()->all()获取请求体里的整个JSON
//INcontroller publicfunctionrecieveJson(Request$request) { $request->json()->all(); //返回值是一个数组 //针对前面的请求例子,json方法返回的是数组["foo"=>"bar"] //$request->json()返回的是ParamBage }
使用Request的input方法获取请求中的整个JSON或者具体key的值
发送JSON请求到Laravel应用的时候,只要Content-Type请求头被设置为application/json,都可以通过input方法获取JSON数据,还可以通过“.”号解析数组:
publicfunctionlaravelRecieveJson(Reuqest$request) { $foo=$request->input('foo');//echo$foo=>'bar' //使用点号获取内嵌数组key的值 //假设请求体中的JSON为{"user":{"name":"kevin","age":18}} $name=$reqeust->input('user.name');//echo$name=>'kevin' }