因为各种原因开始学习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. 2017ICPC南宁补题

    https://www.cnblogs.com/2462478392Lee/p/11650548.html https://www.cnblogs.com/2462478392Lee/p/116501 ...

  2. scipy几乎实现numpy的所有函数

    NumPy和SciPy的关系?   numpy提供了数组对象,面向的任何使用者.scipy在numpy的基础上,面向科学家和工程师,提供了更为精准和广泛的函数.scipy几乎实现numpy的所有函数, ...

  3. ECharts插件介绍(图表库)

    ECharts是一个非常好用的插件,用于进行 树状图,折线图,饼图,地图等等,系列视图的绘制.(详情看官网) 了解: AMD:模块化开发方式: 引入文件后:console.log(echarts) / ...

  4. swiper(轮播)组件

    swiper是一个非常强大的组件 但是需要swiper-item这个标签来实现他想显示的内容 swiper-item标签有个item-id的属性,属性值:字符串 是swiper-item的标识符: 一 ...

  5. loj#6487 基础 FFT 练习题

    分析 仔细观察a[i],b[i]的数据范围 于是我们转为枚举所有a[i],b[i]的值 然后暴力即可 代码 #include<bits/stdc++.h> using namespace ...

  6. github创建仓库,往github上上传自己的项目

    k第一步: 在github上创建仓库 第二步: 创建一个新的项目,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上传代码的时候需要使用 这个地址必须要记住!!! 第 ...

  7. vue --》组件的封装 及 参数的传递

    vue组件的定义 ● 组件(Component)是Vue.js最强大的功能之一 ● 组件可以扩展HTML元素,封装可重用代码 ● 在较高层面上,组件是自定义元素,Vue.js的编译器为他添加特殊功能 ...

  8. (一) MySQL架构

    1.MySQL架构 MySQL拥有分层的架构,上层是服务器层的服务和查询执行引擎,下层是存储引擎,真正负责数据的存储和提取. 服务层包含了连接和线程处理,以及大多数MySQL的核心服务,如对SQL的解 ...

  9. [mysql相关集锦] 001 - mysql zip安装/The service already exists/MySQL 服务无法启动

    本随笔参考了其他博客内容,且在验证有效之下才或誊抄或摘录或加上自己经验组合而成. 参考博客: 1,https://www.jianshu.com/p/413d29b67422 2,https://bl ...

  10. Git-第三篇廖雪峰Git教程学习笔记(2)回退修改,恢复文件

    1.工作区 C:\fyliu\lfyTemp\gitLocalRepository\yangjie 2.版本库 我们使用git init命令创建的.git就是我们的版本库.Git的版本库里存了很多东西 ...