Laravel PUT、PATCH、POST、GET 获取提交信息

2019-03-11 08:58:56   Laravel
  Laravel  

在使用laravel开发restful api的时候,我们知道,不同的操作用不同的请求方法,这就需要知道get、post、put、patch、delete等方法获取数据的方式是怎样的


GET

在Controller中

public function index(Request $request)
{
    $size = $request->size;
}

POST

获取全部form表单信息:

$request->input()

获取某一个:

$request->input('username')

PUT&PATCH&DELETE

原因

我们知道,put和patch都是在update操作的时候使用,不同的是,put需要提交全部信息,而patch只需要提交需要修改的信息即可。原以为跟post获取方式是一样的,后来发现自己太天真了,为什么会不一样呢? Illuminate\Http\RequestcreateFromGlobals方法是这样定义的:

public static function createFromGlobals()
{
        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
                && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
                parse_str($request->getContent(), $data);
                $request->request = new ParameterBag($data);
        }
        return $request;
}

这里面的if语句定义如果Content-Type 不是 application/x-www-form-urlencode ,请求方法为PUT, DELETE, PATCH时,就无法解析。post方法可以正常使用是因为php本身就支持$_POST变量,而PUT, DELETE, PATCH 走的是 php://input

方法

我们针对上面的原因分析,我们提供两种方法

第一种,直接获取输入流:

$request->getContent()

这种一般不推荐用,因为输入流数据比较乱,拿到后还要复杂的处理。

第二种是发送请求时,定义Content-Typeapplication/x-www-form-urlencode ,然后我们可以用post的方式获取了。

$request->input()

问题就在这里,如果你的 Content-Type 不是 application/x-www-form-urlencode ,且请求方法又是 PUT、DELET 或 PATCH,就会无法解析(POST 正常是因为 PHP 原生支持解析为 $_POST 变量,而 PUT 只能走 php://input 输入流获取),如果这里不是这个 Content-Type 就会悲剧。

解决办法有三个,一个是继承 Request 对象或通过其他扩展手段重写或补充这部分(这个是最佳实践),还有就是通过 $request->getContent 获取原始内容解析(这个问题较多,新手不建议),最后就是改提交内容类型。


URL参数获取

先看一个例子

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

在这个例子中,我们在URL中定义{post}, {comment}两个路径参数,而我们在匿名函数中则按照顺序定义两个参数变量$postId,$commentId,然后我们就直接可以用这两个变量获取参数值了。

当然了,更多情况下我们还是在Controller中写逻辑

路由定义

Route::get('posts/{post}/comments/{comment}','HomeController@index');

HomeController 中获取

public function index($postId, $commentId)
{
  dump($postId);
    dump($commentId);
}
viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/117
欢迎小伙伴们在下方评论区留言 ~ O(∩_∩)O
文章对我有帮助, 点此请博主吃包辣条 ~ O(∩_∩)O

猜你喜欢


评论

There are no comments yet.
未登录

登录后即可发表评论

登录或注册

标签

AdSense Anaconda Android apache API apt Auth AWS B-tree Bandwagon Blog bower brew bytes Caffe Catalina certbot Charles cloudcone Composer conda CoreML CPU crontab CSS csv Cuda cv2 datetime Digitalocean DNS Docker Docker-Compose Eloquent Excel export Flask FTP GET Git GitHub GitLab Gmail GoDaddy Google GTM hash Homebrew Homestead HTML http HTTPS IDEA image imagemagick imagick imgick import InnoDB ios iou iPhone ISO8601 iTerm2 Java JavaScript JPG JS Keras Laravel Laravel-Admin lazyload Linux list Livewire lnmp load logs Lravel Mac Markdown matplotlib md5 mix MobileNet Mojave mongo MongoDB MySQL Namesilo Nginx Node npm numpy Nvidia Nvidia-Docker onevps OpenCV Openpose openpyxl oss Outline parse PayPal PHP php-fpm PhpStorm PHP扩展 PIL Pillow pip PNG POST Protobuf PyCharm pyenv pymongo Python Python,人工智能,机器学习,VOC,xml Queue Redis requests RGB Sanctum save selenium SEO Shadowsock Shadowsocks ShadowsocksR simplemde Spring Boot SQLServer ssd SSH ssl SSL证书 SSR str Sublime sudo swap Swift Tensorflow TensorflowLite Terminal Terminator timestamp Ubuntu urllib UTC v2ray Valet Validation Validator VienBlog virtualenvs VPN VPS Vultr Web Windows WordPress Xcode xlsx yaml YAPI YUV zip zmq zsh 上网 下载图片 主从同步 云主机 云存储 云开发 云服务器 人工智能 优化 优惠码 伪原创 作弊与反作弊 免费ss账号 免费提现 切片 前端 加密 协议 博客 友链 双击事件 后台运行 后端 命令 国内镜像源 图标 图片操作 图片转换 域名 多身份认证 大小写转换 姿态检测 安卓模拟器 安装 定时任务 定时执行 密码 密钥 导出导入 小程序码 延迟加载 异常 微信 微信小程序 快捷方式 慢查询 懒加载 提现 搜索引擎 搬瓦工 搭梯子 教程 数据库 数据重复 文件上传 无法登录 日志 日期 时区 时间 时间戳 服务器 机器学习 权限 梯子 模拟浏览器 港版支付宝 漏洞 爬虫 生活服务 用户管理 病毒 登录 目标检测 科学上网 系统升级 索引 组件 组件开发 编辑器 自动付款 自定义组件 英文伪原创 计划任务 计算机视觉 订阅通知 认证 语法 读写分离 远程连接 配置文件 重定向 错误异常 错误提示 队列 阿里云 香港 香港手机号
亲情非友情链接