欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP实现发送和接收JSON请求

程序员文章站 2023-02-10 11:57:21
现在微服务中,很多api由于需要传递的参数较多所以要求用包含所有参数的json数据作为post请求的请求体来替代formdata传递参数的方式,在参数量较多时post js...

现在微服务中,很多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);

$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: 在 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'
}