PHP: thinkPHP踩坑记录(实现API接口以及处理莫名其妙的500问题)
因为各种原因开始学习PHP,并且要在两周内能够对PHP项目进行二次开发,还好PHP够简单,至少入门很简单,很快就接触thinkPHP框架.
在了解了路由匹配视图的规则之后,开始着手尝试编写API接口,期间由于没有好好查看官方的命名规范文档,导致出了些不必要的错误.
命名规范文档: https://www.kancloud.cn/manual/thinkphp5/118007
目前发现的能够输出json数据的关键字有两个:
return 返回数据
exit 返回并退出(结束进程)
开发前后端分离开发中,GET请求比较好处理,通过 $_GET变量可以直接拿到查询字符串参数, 但是AJAX 的 请求体发送 json 数据不能通过 $_POST变量拿到, 据说该变量只能接受网页方式传递的表单数据.
想拿到ajax 传递的 json数据可以通过
file_get_contents('php://input')
方式拿到,但是拿到的是字符串形式的json,需要解析:
json_decode(file_get_contents('php://input'))
PHP提供一个Json类可以直接响应json格式的数据, 也可以通过 exit(json)的方式来输出json数据,只是exit执行之后会结束整个进程,这里需要注意.
另外由于exit函数接受的是字符串形式的参数,所以需要手动修改响应头:
header('Content-Type:application/json; charset=utf-8');
exit(json_encode(json);
所以我就可以写一个基类了:
<?php
namespace app\commonBase\controller; class BaseController
{
protected function responseJson($code=200, $msg="success", $data=[], $status=200) {
$resp = array('code'=>$code, 'msg'=>$msg, 'data'=>$data); // 返回JSON数据格式到客户端 包含状态信息
header('Content-Type:application/json; charset=utf-8');
return json($resp, $status);
} // 解析 ajax 请求体数据
protected function ajaxJsonData() {
return json_decode(file_get_contents('php://input'));
} // 获取请求体数据
protected function bodyParams($key='') {
$body = $this->ajaxJsonData();
if (isset($body[$key])) {
return $body[$key];
} else {
return null;
}
} // 解析查询字符串数据
protected function queryParams($key='') {
if (isset($_GET[$key])) {
return $_GET[$key];
} else {
return null;
}
}
}
可能是受Python的框架风格影响较深,总喜欢将后台业务代码再进行细化, 具体的数据库操作,请求数据解析,权限管理等逻辑进行分离, 方便管理和维护.
除了上面的问题之外,还有一个很诡异的问题,就是我的接口运行正常,也能正常响应,但是前端浏览器显示状态码为 500;
找了下网上的资料,发现时日志写入权限的问题,查看了下Apache运行日志:

问题出在这个位置:

第46行,如果路径不是目录,则创建目录,目录名什么的可以到源代码里面去找:

把这个文件夹的写入权限加上就可以了.
public/runtime文件夹
PHP: thinkPHP踩坑记录(实现API接口以及处理莫名其妙的500问题)的更多相关文章
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- VUE使用微信JDK(附踩坑记录)
VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- manjaro xfce 18.0 踩坑记录
manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...
- 移动端Video标签踩坑记录
需求 用户能在手机上上传视频并预览. 问题 上传完成后安卓下封面展示正常,ios下封面空白.如下图所示: 利用canvas截取视频第一帧发现,ios下截取到的第一帧一直是空白图片, 安卓正常. 后端利 ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
随机推荐
- J - Mr.Panda and TubeMaster
题解 我们可以把每个格子拆成两个点,一个表示横向的,一个表示纵向的,相邻的格子横向和纵向连边. 如果直接按照题意做的话,我们应当在横向和纵向的点之间连边,有限制的边设下界为1,然后跑可行流. 或者考虑 ...
- UE4从4.15移植到4.16
如果是旧版本的工程需要移植到4.16,有几个地方需要修改: 假设RC是工程名,修改如下(三个CS文件) 类似的,插件也需要这样修改
- Educational Codeforces Round 16 D. Two Arithmetic Progressions (不互质中国剩余定理)
Two Arithmetic Progressions 题目链接: http://codeforces.com/contest/710/problem/D Description You are gi ...
- 大数据笔记(二)——Apache Hadoop的体系结构
一.分布式存储 NameNode(名称节点) 1.维护HDFS文件系统,是HDFS的主节点. 2.接收客户端的请求:上传.下载文件.创建目录等. 3.记录客户端操作的日志(edits文件),保存了HD ...
- PJSIP库设置Via地址
好记性不如烂笔头,解决项目问题,调试代码跟踪到PJSIP 设置Via地址位置,记录下来,以备后用. PJSIP库在方法stateless_send_transport_cb中设置Via地址值,该方法在 ...
- firefox的group群组功能很好!
================================ /usr/share/themes中有一些主题,包括: adwaita: 阿德维塔, 不二论 anaconda等等. 计算机环境: f ...
- ThreadPoolExecutor 源码分析
ThreadPoolExecutor 线程池核心实现类 线程池的生命周期 RUNNING: 接受新任务,同时处理工作队列中的任务 SHUTDOWN: 不接受新任务,但是能处理工作队列中的任务 STOP ...
- 解决Chrome网页编码显示乱码的问题
解决Chrome网页编码显示乱码的问题 记得在没多久以前,Google Chrome上面出现编码显示问题时,可以手动来调整网页编码问题,可是好像在Chrome 55.0版以后就不再提供手动调整编码,所 ...
- Prometheus Alertmanager Grafana 监控警报
Prometheus Alertmanager Grafana 监控警报 #node-exporter, Linux系统信息采集组件 #prometheus , 抓取.储存监控数据,供查询指标 #al ...
- 1 基础架构:一条sql查询语句如何执行?
1 基础架构:一条sql查询语句如何执行? 分析一个最简单的查询 mysql> select * from T where ID=10: MySQL基本架构示意图 大体来说,mysql可以分为s ...