现在在微服务中,由于需要传递的参数较多,很多API都需要使用包含所有参数的JSON数据作为POST请求的请求体,以替代FormData中传参的方式被通过。长期以来,POSTJSON比POSTFormData更易于开发和测试。今天我们就来看看如何在PHP中发送和接受JSONPOST,以及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);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无效时。注意:PHP5.6之前,php://input打开的数据流只能读取一次;数据流不支持seek操作。然而,根据SAPI的实现,当请求体数据被保存时,它可以打开另一个php://input数据流并再次读取。通常,这仅适用于POST请求,而不适用于PUT或PROPFIND等其他请求方法。使用Guzzle发送JSON请求在开发中很多时候,我们并不是像上面那样使用phpcurl库发送请求,而是使用开源的Http包。Guzzle等常用的Http包提供了发送JSON请求的便捷方法。//Guzzle版本>=5useGuzzleHttp\Client;$client=newClient();$response=$client->post('url',[GuzzleHttp\RequestOptions::JSON=>['foo'=>'bar']]);在Laravel中接受JSONPOST使用Request的json()->all()获取请求体中的整个JSON//INcontrollerpublicfunctionrecieveJson(Request$request){$request->json()->all();//返回值是一个数组//对于前面的请求例子,json方法返回一个数组["foo"=>"bar"]//$request->json()returnsParamBage}使用Request输入法获取请求中的整个JSON或特定键的值。在向Laravel应用程序发送JSON请求时,只要将Content-Type请求头设置为application/json,即可通过输入法获取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=>'凯文'}
