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' 
}

results matching ""

    No results matching ""