因为各种原因开始学习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问题)的更多相关文章

  1. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  2. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  3. VUE使用微信JDK(附踩坑记录)

    VUE使用微信分享SDK(附踩坑记录) 微信分享官方文档 安装JS-SDK npm i -S weixin-jsapi 引入包 ES5 写法 const wx = require('weixin-js ...

  4. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  5. manjaro xfce 18.0 踩坑记录

    manjaro xfce 18.0 踩坑记录 1 简介1.1 Manjaro Linux1.2 开发桌面环境2 自动打开 NumLock3 系统快照3.1 安装timeshift3.2 使用times ...

  6. 移动端Video标签踩坑记录

    需求 用户能在手机上上传视频并预览. 问题 上传完成后安卓下封面展示正常,ios下封面空白.如下图所示: 利用canvas截取视频第一帧发现,ios下截取到的第一帧一直是空白图片, 安卓正常. 后端利 ...

  7. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  8. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  9. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

随机推荐

  1. jvm监测

    jvm调优,首先,你得会jvm性能检测.开方得先诊断啊.

  2. 高通camera基本代码架构【转】

    本文转载自:http://blog.sina.com.cn/s/blog_c0de2be70102vyn1.html 1  camera基本代码架构 高通平台对于camera的代码组织,大体上还是遵循 ...

  3. Intellij IDEA中使用Debug调试详解

    转载:https://www.linuxidc.com/Linux/2017-09/146772.htm   Intellij IDEA中使用Debug调试详解 Debug用来追踪代码的运行流程,通常 ...

  4. list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库

    /// <summary> /// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list&q ...

  5. python json字符串中有int类型数字(不带引号)

    def jsonfy(s:str)->object: obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))()) ...

  6. git全套详细教程

    git安装 首先,我们要去git的官网下载一个git安装包,双击到无关紧要的步骤我就不详细描述了,直接介绍我们关键的步骤. 选择git包含的内容和打开方式 选择都很清晰,具体情况我不是很清楚,不过选择 ...

  7. 011-Spring Boot 运行流程分析SpringApplication.run

    一.程序入口 1.1.静态方法 //直接调用run方法 ConfigurableApplicationContext context = SpringApplication.run(App.class ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_4_字节输出流写入数据到文件

    数据由内存写入到硬盘中 构造函数传的路径是一个相对路径.有异常需要捕获异常 释放资源 这三个方法,都有异常 IO异常是父类,所以这里只需要抛出IO异常就可以了. 运行程序.目录内多了个a.txt文件 ...

  9. dataTables使用的详细说明整理

    本文共三个部分:官网|基本使用|遇到的问题 一.官方网站:http://www.datatables.club/ 二.基本使用: 1.dataTables的引入及初始化 <!--第一步:引入Ja ...

  10. log4net 配置文件配置方法

    转自:http://www.dozer.cc/2013/06/log4net-config-file-order/ 最近把项目中所有的日志都改成了 log4net ,同事也蠢蠢欲动,用起了 log4n ...