1. 返回参数
字段名 | 中文 | 类型 | 返回条件 | 说明 |
---|---|---|---|---|
apid | 接口ID | string | 必有返回 | 网关发送API请求的ID |
fault | 瑕疵次数 | int | 必有返回 | 接口发生瑕疵的次数,本字段值计入数据库,并不显式给客户端,用于提示平台开发者,API的健康状况。 |
status | 网络返回 | int | int | http请求的标准网络返回 |
error | 错误码 | int | int | 错误码 |
reason | 错误理由 | string | string | 错误理由(英文) |
message | 错误说明 | string | string | 错误说明(英文) |
advice | 解决建议 | string | string | 针对接口问题该如何解决(英文) 默认是Noadvice |
result | 返回结果 | dict | dict | 返回的结果字典(不能是字符串,数组)。 |
debug | 返回调试 | dict | 令牌bug=1 | 返回的调试字典(不能是字符串,数组)。 |
trace | 堆栈信息 | dict | 令牌bug=T | 返回数组形式的堆栈。 |
event | 请求事件 | dict | 令牌bug=1 | 返回的请求事件字典,本字段存入数据库,并不显式给客户端。 |
latency | 时间评估 | string | 令牌bug=1 | 返回的时间成本,单位是毫秒,分别是FC估计时间和AG时间。格式是"3200/5600" |
fclog | 函数日志 | string | 令牌bug=L | 是否成功记录函数日志。其它:记录失败 ok :记录成功 |
dblog | 日志成功 | string | 令牌bug=L | 核心API要把访问立马返回给mysql数据库。其它:记录失败 ok :记录成功 |
[!note] fclog和dblog用
ok
而不用true
就是因为ok是典型的成功标志,而true么有这样的命名历史。[!note|label:Noadvice的起名] 不用NoAdvice而用Noadvice,这样更有命名感。
[!note|label:字段在哪里添加?] 大部分字段要在Asmret自动添加的。只有fault,error,reason,message,debug是在自己的函数产生。
[!note|label:函数日志记录为什么可能失败?] 因为函数日志是记录字符串的,有些像backtrace的对象是无法通过json_encode变成字符串的,这个时候就会把NULL写入日志,毫无意义。算是日志失败。
[!note|label:为什么核心函数执行要直接进入mysql日志,而不是交给日志服务区分析,综合再进入mysql日志?] 核心函数的执行非常关键,次数少,于是不能依赖太多其它程序。必须自给自足。
[!note|label:为什么event不能放在debug字段里?] 因为event是一个必须字段,如果放在debug里,徒增检查这个必须字段的成本。另外,debug是要暴露给客户端的,有时候我们只想暴露自定义的调试内容给客户端,不想把整个event暴露给客户端。另外,从信息等级来说,event代表了API的输入, result代表了输出,他们级别相同。
[!danger|label:为什么要额外使用message字段?]
1.1. 第一:对于API的错误信息设计来说,一个精短的原因标题和一个长的提示内容是一般的消息框的标准格式。第二:早期的一个设计是吧reason和tip之间用冒号隔开,既然这样的作法是标准做法,还不如在外面设计出来。
[!danger|label:为什么message不能放在result里?]
1.2. 原因同event不能放在debug里一样,对于几乎标准的字段,都应该抽取出来。
[!danger|label:当status不是200时,reason,advice,和message如何生成?]
1.3. status不是200时,reason/advice/message只能SDK自己生成,或者SDK开发者通过文档自己生成。
[!note|label:reason/advice/message如何汉化?]
1.4. reason比较短,不用空格隔开。很容易做枚举翻译。message和advice都很长,但也只能通过字典翻译。翻译中必然涉及变量参数问题,我想各个语言都能处理。
[!note|label:如何能看到debug字段?] debug字段是调试字段,里面会暴露数据库/接口设计,所以只有特殊的权限才能看到调试结果。要想看到调试字段,需要用特殊的令牌,令牌里的bug字段打开后就可以看到。
[!TIP|style:flat|label:错误理由|iconVisibility:hidden] 如果接口成功,那么reason必须是"Success",如果失败,默认的错误理由是"Failure"。因为历史原因,在原来的接口里存在大量的小写"success"。
[!TIP|style:flat|label:返回结果|iconVisibility:hidden] 所有接口必须保证result是字典。不能把php的数组,python的list赋值给result。接下来讲解result在不同类型的请求下的组成。
[!TIP|label:lantency字段精确性?] debug字段是调试字段,
2. 如何获取返回参数
HTTP/HTTPS 请求的返回结果有 HttpCode、Header、Body 三部分。当请求报错时,由于没有进入业务逻辑,所以返回的 Body 可能为空,表现为“返回值为空”,但实际上,重要信息都在 Header 里面。
用户发起的 API 请求只要能够到达网关,就会返回成功/错误的结果信息。
重要的返回信息都在Header里面,以X-Ca开头的为网关返回的信息。其中较主要的为下面的几个信息:
X-Ca-Request-Id: 7AD052CB-EE8B-4DFD-BBAF-EFB340E0A5AF
//请求唯一ID,请求一旦进入API网关应用后,API网关就会生成请求ID并通过响应头返回给客户端,建议客户端与后端服务都记录此请求ID,可用于问题排查与跟踪
X-Ca-Error-message: Invalid Url
//API网关返回的错误消息,当请求出现错误时API网关会通过响应头将错误消息返回给客户端
X-Ca-Debug-Info: {"ServiceLatency":0,"TotalLatency":2}
//当打开Debug模式后会返回Debug信息,此信息后期可能会有变更,仅用做联调阶段参考
在 Header 中获得 X-Ca-Error-message 可以基本明确报错原因,而 X-Ca-Request-Id 可以用于提供给这边的支持人员,供支持人员搜索日志。
所以如果发送请求后,发现返回值为空,那么看一下返回的 Header 信息。如果请求到达网关就错误返回了,那么 Body 为空很正常,会表现为返回值为空,但是在 Header 里面会有重要信息。
如果Header也为空,那么说明请求没有达到网关,请自行检查网络状况等。
各种语言获取和查看 HTTP/HTTPS 头部信息的方法均可在网上查询到。
3. PHP如何处理异常例外
try{
//some php code here
}catch(Exception $e){
$backtrace = debug_backtrace(2);
return asmret($logdata,5000,"HandlerException",$e,$backtrace);
}
当出现例外后,result字段,也就是序列化后的$e是这样的
{
xdebug_message:'\nErrorException: Undefined variable: param in /code/index.php on line 357\n\nCall Stack:\n 0.0003 439368 1. {main}() /var/fc/runtime/php7.2/src/server.php:0\n 0.0374 2292408 2. React\\EventLoop\\StreamSelectLoop->run() /var/fc/runtime/php7.2/src/server.php:124\n 958.6793 9632720 3. React\\EventLoop\\StreamSelectLoop->waitForStreamActivity() /var/fc/runtime/php7.2/builtIn/http/vendor/react/event-loop/src/StreamSelectLoop.php:205\n 958.6793 9633200 4. React\\Stream\\DuplexResourceStream->handleData() /var/fc/runtime/php7.2/builtIn/http/vendor/react/event-loop/src/StreamSelectLoop.php:238\n 958.6793 9703232 5. React\\Stream\\DuplexResourceStream->emit() /var/fc/runtime/php7.2/builtIn/http/vendor/react/stream/src/DuplexResourceStream.php:193\n 958.6793 9703232 6. React\\Stream\\Util::React\\Stream\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6793 9703608 7. React\\Socket\\Connection->emit() /var/fc/runtime/php7.2/builtIn/http/vendor/react/stream/src/Util.php:71\n 958.6793 9703608 8. React\\Http\\Io\\RequestHeaderParser->feed() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6793 9707704 9. React\\Http\\Io\\RequestHeaderParser->parseAndEmitRequest() /var/fc/runtime/php7.2/builtIn/http/src/Io/RequestHeaderParser.php:47\n 958.6799 9735120 10. React\\Http\\Io\\RequestHeaderParser->emit() /var/fc/runtime/php7.2/builtIn/http/src/Io/RequestHeaderParser.php:59\n 958.6799 9735120 11. React\\Http\\StreamingServer->React\\Http\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6801 9775600 12. React\\Socket\\Connection->emit() /var/fc/runtime/php7.2/builtIn/http/src/StreamingServer.php:179\n 958.6801 9775600 13. React\\Http\\Io\\CloseProtectionStream->handleData() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6801 9775976 14. React\\Http\\Io\\CloseProtectionStream->emit() /var/fc/runtime/php7.2/builtIn/http/src/Io/CloseProtectionStream.php:96\n 958.6801 9775976 15. React\\Http\\Io\\LengthLimitedStream->handleData() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6801 9778536 16. React\\Http\\Io\\LengthLimitedStream->emit() /var/fc/runtime/php7.2/builtIn/http/src/Io/LengthLimitedStream.php:87\n 958.6801 9778536 17. React\\Http\\Io\\HttpBodyStream->handleEnd() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6801 9778536 18. React\\Http\\Io\\HttpBodyStream->close() /var/fc/runtime/php7.2/builtIn/http/src/Io/HttpBodyStream.php:179\n 958.6801 9771392 19. React\\Http\\Io\\HttpBodyStream->emit() /var/fc/runtime/php7.2/builtIn/http/src/Io/HttpBodyStream.php:80\n 958.6801 9771392 20. React\\Promise\\Stream\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php:123\n 958.6801 9771392 21. React\\Promise\\Promise::React\\Promise\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise-stream/src/functions.php:43\n 958.6801 9771448 22. React\\Promise\\Promise->settle() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:231\n 958.6801 9770752 23. React\\Promise\\Promise::React\\Promise\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:168\n 958.6801 9770752 24. React\\Promise\\FulfilledPromise->done() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:135\n 958.6802 9770752 25. React\\Promise\\Promise::React\\Promise\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/FulfilledPromise.php:39\n 958.6802 9770808 26. React\\Promise\\Promise->settle() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:231\n 958.6802 9769712 27. React\\Promise\\Promise::React\\Promise\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:168\n 958.6802 9769712 28. React\\Promise\\FulfilledPromise->then() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/Promise.php:134\n 958.6802 9769712 29. React\\Http\\Middleware\\RequestBodyBufferMiddleware->React\\Http\\Middleware\\{closure}() /var/fc/runtime/php7.2/builtIn/http/vendor/react/promise/src/FulfilledPromise.php:25\n 958.6802 9772608 30. React\\Http\\Io\\MiddlewareRunner->React\\Http\\Io\\{closure}() /var/fc/runtime/php7.2/builtIn/http/src/Middleware/RequestBodyBufferMiddleware.php:58\n 958.6802 9772608 31. React\\Http\\Io\\MiddlewareRunner->call() /var/fc/runtime/php7.2/builtIn/http/src/Io/MiddlewareRunner.php:54\n 958.6802 9773304 32. React\\Http\\Middleware\\RequestBodyParserMiddleware->__invoke() /var/fc/runtime/php7.2/builtIn/http/src/Io/MiddlewareRunner.php:59\n 958.6802 9773304 33. React\\Http\\Io\\MiddlewareRunner->React\\Http\\Io\\{closure}() /var/fc/runtime/php7.2/builtIn/http/src/Middleware/RequestBodyParserMiddleware.php:34\n 958.6802 9773304 34. React\\Http\\Io\\MiddlewareRunner->call() /var/fc/runtime/php7.2/builtIn/http/src/Io/MiddlewareRunner.php:54\n 958.6802 9773304 35. ServerlessFC\\{closure}() /var/fc/runtime/php7.2/builtIn/http/src/Io/MiddlewareRunner.php:49\n 958.6807 9778056 36. ServerlessFC\\NormalHandler->invoke() /var/fc/runtime/php7.2/src/server.php:100\n 958.6807 9778056 37. handler() /var/fc/runtime/php7.2/src/invoke.php:73\n 958.6814 9801176 38. ServerlessFC\\NormalHandler->fc_exception_error_handler() /code/index.php:357\n'
}