zoukankan      html  css  js  c++  java
  • 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函数接受的是字符串形式的参数,所以需要手动修改响应头:

    1 header('Content-Type:application/json; charset=utf-8');
    2 exit(json_encode(json);

    所以我就可以写一个基类了:

     1 <?php
     2 namespace appcommonBasecontroller;
     3 
     4 class BaseController
     5 {
     6     protected function responseJson($code=200, $msg="success", $data=[], $status=200) {
     7         $resp = array('code'=>$code, 'msg'=>$msg, 'data'=>$data);
     8 
     9         // 返回JSON数据格式到客户端 包含状态信息
    10         header('Content-Type:application/json; charset=utf-8');
    11         return json($resp, $status);
    12     }
    13 
    14     // 解析 ajax 请求体数据
    15     protected function ajaxJsonData() {
    16         return json_decode(file_get_contents('php://input'));
    17     }
    18     
    19     // 获取请求体数据
    20     protected function bodyParams($key='') {
    21         $body = $this->ajaxJsonData();
    22         if (isset($body[$key])) {
    23             return $body[$key];
    24         } else {
    25             return null;
    26         }
    27     }
    28 
    29     // 解析查询字符串数据
    30     protected function queryParams($key='') {
    31         if (isset($_GET[$key])) {
    32             return $_GET[$key];
    33         } else {
    34             return null;
    35         }
    36     }
    37 }

    可能是受Python的框架风格影响较深,总喜欢将后台业务代码再进行细化, 具体的数据库操作,请求数据解析,权限管理等逻辑进行分离, 方便管理和维护.

    除了上面的问题之外,还有一个很诡异的问题,就是我的接口运行正常,也能正常响应,但是前端浏览器显示状态码为 500;

    找了下网上的资料,发现时日志写入权限的问题,查看了下Apache运行日志:

    问题出在这个位置:

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

    把这个文件夹的写入权限加上就可以了.

    public/runtime文件夹

  • 相关阅读:
    UCloud可用区的设计理念及功能图文详解
    Centos优化Hadoop
    Linux下使用fdisk扩展分区容量
    Linux内核之数据双链表
    安装 openSUSE Leap 42.1 之后要做的 8 件事
    Linux的防火墙–Iptables
    【转】c# thread.join 理解
    【转】Oracle 查询库中所有表名、字段名、表名说明、字段名说明
    【转】WinForms 使用Graphics绘制字体阴影
    WPF 如何加载图片
  • 原文地址:https://www.cnblogs.com/haiton/p/12073160.html
Copyright © 2011-2022 走看看