接口响应与在线调试

对于接口响应,PhalApi默认使用了HTTP+JSON。通过HTTP/HTTPS协议进行通讯,返回的结果则使用JSON格式进行传递。正常情况下,当接口服务正常响应时,如前面的Hello World接口,可能看到以下这样的响应头部信息和返回内容。

HTTP/1.1 200 OK

Content-Type: application/json;charset=utf-8

... ...

{"ret":200,"data":{"title":"Hello World!"},"msg":""}

而当接口项目抛出了未捕捉的异常,或者因PHP语法问题而出现Error时,则没有内容返回,并且得到一个500的响应状态码。类似如下:

HTTP/1.1 500 Internal Server Error

响应结构

回顾一下默认接口服务返回的内容。类似如下:

{

"ret": 200,

"data": {

"title": "Hello World!",

"content": "PHPer您好,欢迎使用PhalApi!",

"version": "2.0.0",

"time": 1499477583

},

"msg": ""

}

ret字段是返回状态码,200表示成功;data字段是项目提供的业务数据,由接口开发人员定义;msg是异常情况下的错误提示信息。下面分别说之。

业务数据 data

业务数据data为接口和客户端主要沟通对接的数据部分,可以为任何类型,由接口开发人员定义定义。但为了更好地扩展、向后兼容,建议都使用可扩展的集合形式,而非原生类型。也就是说,应该返回一个数组,而不应返回整型、布尔值、字符串这些基本类型。

业务数据主要是在Api层返回,即对应接口类的方法的返回结果。如下面的默认接口服务?s=Site.Index的实现代码。

namespace App\Api;

use PhalApi\Api;

class Site extends Api {

public function index() {

return array(

'title' => 'Hello World!',

'content' => \PhalApi\T('Hi {name}, welcome to use PhalApi!', array('name' => $this->username)),

'version' => PHALAPI_VERSION,

'time' => $_SERVER['REQUEST_TIME'],

);

}

实际上,具体的业务数据需要一段复杂的处理,以满足特定业务场景下的需要。Api层需要与Domain层和Model层共同协作,完成指定的功能。这里暂且知道接口结果是在Api层返回,对应接口类成员方法返回的结果即可。

返回状态码 ret

返回状态码ret,用于表示接口响应的情况。参照自HTTP的状态码,ret主要分为四大类:正常响应、重定向、非法请求、服务器错误。

分类

ret范围

基数

说明

正常响应

200~299

200

表示接口服务正常响应

重定向

300~399

300

非法请求

400~499

400

表示客户端请求非法,对应异常类BadRequestException的异常码

服务器错误

500~599

500

正常响应时,通常返回ret = 200,并且同时返回data部分的业务数据,以便客户端能实现所需要的业务功能。

值得注意的是,抛出的异常应该继承于PhalApi\Exception类,并且构造函数的第一个参数,是返回给客户端的错误提示信息,对应下面将讲到的msg字段。第二个参数是返回状态码的叠加值,也就是说最终的ret状态码都会在400的基数上加上这个叠加值,即:401 = 400 + 1。

例如,常见地,当签名失败时可以返回一个401错误,并提示“签名失败”。

namespace App\Api;

use PhalApi\Api;

use PhalApi\Exception\BadRequestException;

class Hello extends Api {

public function fail() {

throw new BadRequestException('签名失败', 1);

}

}

会得到以下结果输出:

{

"ret": 401,

"data": [],

"msg": "Bad Request: 签名失败"

}

错误提示信息 msg

当接口不是正常响应,即ret不在2XX系列内时,msg字段会返回相应的错误提示信息。即当有异常触发时,会自动将异常的错误信息作为错误信息msg返回。

扩展:如何使用其他返回格式?

除了使用JSON格式返回外,还可以使用其他格式返回结果。

例如在部分H5混合应用页面进行异步请求的情况下,客户端需要服务端返回JSONP格式的结果,则可以这样在DI配置文件./config/di.php中去掉以下注释。

// 支持JsonP的返回

if (!empty($_GET['callback'])) {

$di->response = new \PhalApi\Response\JsonpResponse($_GET['callback']);

}

目前,PhalApi 2.x 已经支持的响应格式有:

当需要返回一种当前PhalApi没提供的格式,需要返回其他格式时,可以:

2、在./config/di.php文件中重新注册\PhalApi\DI()->response服务

在线调试

开启调试调试

开启调试模式很简单,主要有两种方式:

单次请求开启调试:默认添加请求参数&__debug__=1

全部请求开启调试:把配置文件./Config/sys.php文件中的配置改成'debug' => true,

调试信息有哪些?

正常响应的情况下,当开启调试模式后,会返回多一个debug字段,里面有相关的调试信息。如下所示:

{

"ret": 200,

"data": {

},

"msg": "",

"debug": {

"stack": [ // 自定义埋点信息

],

"sqls": [ // 全部执行的SQL语句

]

}

}

温馨提示:调试信息仅当在开启调试模式后,才会返回并显示。

在发生未能捕捉的异常时,并且开启调试模式后,会将发生的异常转换为对应的结果按结果格式返回,即其结构会变成以下这样:

{

"ret": 0, // 异常时的错误码

"data": [],

"msg": "", // 异常时的错误信息

"debug": {

"exception": [ // 异常时的详细堆栈信息

],

"stack": [ // 自定义埋点信息

],

"sqls": [ // 全部执行的SQL语句

]

}

}

查看全部执行的SQL语句

debug.sqls中会显示所执行的全部SQL语句,由框架自动搜集并统计。最后显示的信息格式是:

[序号 - 当前SQL的执行时间ms]所执行的SQL语句及参数列表

示例:

[1 - 0.32ms]SELECT * FROM tbl_user WHERE (id = ?); -- 1

表示是第一条执行的SQL语句,消耗了0.32毫秒,SQL语句是SELECT * FROM tbl_user WHERE (id = ?);,其中参数是1。

查看自定义埋点信息

debug.stack中埋点信息的格式如下:

[#序号 - 距离最初节点的执行时间ms - 节点标识]代码文件路径(文件行号)

示例:

[#0 - 0ms]/path/to/phalapi/public/index.php(6)

表示,这是第一个埋点(由框架自行添加),执行时间为0毫秒,所在位置是文件/path/to/phalapi/public/index.php的第6行。即第一条的埋点发生在框架初始化时。

与SQL语句的调试信息不同的是,自定义埋点则需要开发人员根据需要自行纪录,可以使用全球追踪器PhalApi\DI()->tracer进行纪录,其使用如下:

// 添加纪录埋点

PhalApi\DI()->tracer->mark();

// 添加纪录埋点,并指定节点标识

PhalApi\DI()->tracer->mark('DO_SOMETHING');

通过上面方法,可以对执行经过的路径作标记。你可以指定节点标识,也可以不指定。对一些复杂的接口,可以在业务代码中添加这样的埋点,追踪接口的响应时间,以便进一步优化性能。当然,更专业的性能分析工具推荐使用XHprof。

参考:用于性能分析的XHprof扩展类库。

查看异常堆栈信息

当有未能捕捉的接口异常时,开启调试模式后,框架会把对应的异常转换成对应的返回结果,并在debug.exception中体现。而不是像正常情况直接500,页面空白。这些都是由框架自动处理的。

例如,让我们故意制造一些麻烦,手动抛出一个异常。

class Hello extends Api {

public function fail() {

throw new Exception('这是一个演示异常调试的示例', 501);

}

}

再次请求后,除了SQL语句和自定义埋点信息外,还会看到这样的异常堆栈信息。然后便可根据返回的异常信息进行排查定位问题。

添加自定义调试信息

当需要添加其他调试信息时,可以使用PhalApi\DI()->response->setDebug()进行添加。

如:

class Hello extends Api {

public function fail() {

$x = 'this is x';

$y = array('this is y');

\PhalApi\DI()->response->setDebug('x', $x);

\PhalApi\DI()->response->setDebug('y', $y);

}

}

请求后,可以看到:

"debug": {

"x": "this is x",

"y": [

"this is y"

]

}

phalapi做登录检测_1.4 PhalApi 2.x 接口响应与在线调试相关推荐

  1. phalapi做登录检测_phalApi

    #PhalApi(π框架) - PHP轻量级开源接口框架 - V1.3.4 PhalApi,简称π框架,专注于接口开发,致力让接口开发更简单.支持HTTP.SOAP和RPC协议,可用于快速搭建微服务. ...

  2. 1.4 PhalApi 接口响应与在线调试

    接口响应与在线调试 对于接口响应,PhalApi默认使用了HTTP+JSON.通过HTTP/HTTPS协议进行通讯,返回的结果则使用JSON格式进行传递.正常情况下,当接口服务正常响应时,如前面的He ...

  3. 干货|使用合成数据集来做目标检测

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Sergey Nikolenko 来源丨AI公园 编辑丨极市平 ...

  4. 使用合成数据集来做目标检测:目标检测的介绍

    作者:Sergey Nikolenko 编译:ronghuaiyang 来源:AI公园 导读 本文讨论使用生成数据集来做目标检测的一些基础概念. 今天,我们开始一系列专门讨论一个特定的机器学习问题,这 ...

  5. 比Tiny YOLOv3小8倍,性能提升11个点,4MB的网络也能做目标检测

    在本文中,来自滑铁卢大学与 Darwin AI 的研究者提出了名为 YOLO Nano 的网络,他们通过人与机器协同设计模型架构大大提升了性能.YOLO Nano 大小只有 4.0MB 左右,比 Ti ...

  6. 网络设备Web登录检测工具device-phamer

    网络设备Web登录检测工具device-phamer 为了便于管理和维护,大部分网络都提供了Web管理接口.Kali Linux提供了一款专用检测工具device-phamer.该工具可以批量检测IP ...

  7. lidar激光雷达介绍,以及使用激光雷达数据通过深度学习做目标检测

    文章目录 1 频率 1.1 频率定义 1.2 频率的计算公式 1.3 频率单位换算 1.4 频率概念使用范畴 1.5 频率的具体使用场景 2 光 2.1 光的定义 2.2 光的传播速度 3 激光 3. ...

  8. dlib做人脸检测判断有没有检测到人脸

    dlib做人脸检测判断有没有检测到人脸 文章目录: 一.人脸检测 二.判断有没有检测到人脸 其实我用dlib 检测人脸只是用来做个触发条件,但是我不知道怎么判断有没有检测到人,因为从返回值只知道是一个 ...

  9. python写appium_案例分享,Python +appium做登录功能

    原标题:案例分享,Python +appium做登录功能 Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,同时又是一个跨平台的工具:它允许测试人员在不同 ...

  10. Spring Boot中防表单重复提交以及拦截器登录检测

    目录 理论 演示 源码 理论 在用户登录后,如果按F5刷新会出现表单重复提交的问题,解决这个问题后,如果没有拦截器登录检测,就会造成,任意用户可以登录后台界面,所以要有拦截器登录检测. 相关的逻辑步骤 ...

最新文章

  1. linux怎么创建用户教程,在Linux中如何手动创建一个用户
  2. 自监督媲美全监督,港中文、商汤场景去遮挡方法入选 CVPR 2020 Oral
  3. CountDownLatch 的使用 || enum 枚举使用的小技巧
  4. Servlet 的常见错误总结
  5. fiddler如何向服务器发送信息,fiddler 保存请求数据并发送到自己的服务器接口 抓包...
  6. 你见过动物是怎么笑的吗?赶紧来看看【组图】
  7. Apsara Stack 技术百科 | 可运营的行业云,让云上资源跑起来
  8. 云原生五大趋势预测,K8s安卓化位列其一
  9. 成因:六大元凶让肝不堪重负
  10. 去掉iPhone、iPad的默认按钮样式
  11. 二手机床:中国高端机床装备制造列入战略性产业
  12. oracle 自动化运维--自动搭建oracle dataguard 运维工具(开发源代码)
  13. 学计算机专科好还是牙医好,孩子明年高考,牙科、计算机两个专业,怎么选?...
  14. USBclean for Mac(U盘病毒查杀工具)
  15. 挂马攻击的介绍和防御
  16. 计算机硬盘使用率测试软件,测试硬盘速度的10款软件
  17. 腾达f6虚拟服务器,腾达(Tenda)F6路由器无线wifi设置
  18. 淘宝/天猫获取商品历史价格信息 API 返回值说明
  19. 服务器到底是个什么东东?跟电脑有啥区别?
  20. Python编辑器UliPad安装

热门文章

  1. Report Service 为用户“NT AUTHORITY、NETWORK SERVICE”授予的权限不足,无法进行此操作。(rsAccessDenied)处理...
  2. mac+ffmpeg+php,mac折腾安装ffmpeg小记
  3. python大家都是怎么学的_你们都是怎么学 Python 的?
  4. 那些不需要你知道的Chrome DevTool - 使用技巧篇
  5. 获得PMP认证的过程及心路历程
  6. Java中将List转成逗号数组的方案
  7. jquery特效 商品SKU属性规格选择实时联动
  8. CSS3魔法堂:说说Multi-column Layout
  9. 在一个centos6上安装多个不同版本python
  10. cifs mount fail