摘要:发送接受是个可以访问请求的原始数据的只读流。在之前打开的数据流只能读取一次数据流不支持操作。不过,依赖于的实现,请求体数据被保存的时候,它可以打开另一个数据流并重新读取。
现在微服务中,很多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 GuzzleHttpClient;
$client = new Client();
$response = $client->post("url", [
GuzzleHttpRequestOptions::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"
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28763.html
摘要:响应一般由三个部分组成由一个数字和文字组成的状态码,用来显示请求是成功还是失败响应头,包含服务器类型,日期时间,内容类型和长度等响应体,也就是响应正文。获得形式的相应数据。和以数字和文本形式返回状态码。 学习目录: AJAX基础 PHP与AJAX JSON格式 jQuery中的AJAX 个人网站原创链接地址:不足之处欢迎留言...逃... showImg(https://segm...
摘要:响应一般由三个部分组成由一个数字和文字组成的状态码,用来显示请求是成功还是失败响应头,包含服务器类型,日期时间,内容类型和长度等响应体,也就是响应正文。获得形式的相应数据。和以数字和文本形式返回状态码。 学习目录: AJAX基础 PHP与AJAX JSON格式 jQuery中的AJAX 个人网站原创链接地址:不足之处欢迎留言...逃... showImg(https://segm...
摘要:因为是多进程单线程同步模式,即一个子进程同时最多处理一个请求,所以子进程数等于最大并发数。 a little tips in my code career | 码码踩过的那些坑2015-2016 记一下这一年码码中我需要去了解的基础知识,有不对的欢迎大家指证出来:https://github.com/TIGERB/car... 关于设计模式 关于PHP 关于互联网协议 设计模...
阅读 3169·2021-11-22 14:45
阅读 3323·2019-08-29 13:11
阅读 2325·2019-08-29 12:31
阅读 941·2019-08-29 11:21
阅读 3009·2019-08-29 11:09
阅读 3635·2019-08-28 18:11
阅读 1438·2019-08-26 13:58
阅读 1308·2019-08-26 13:27
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要