Oracle ORDS自定义400错误响应返回HTML而非JSON如何解决
问题描述
- 基于POST方法开发的REST API,正常请求场景下运行无异常
- 返回自定义400状态码的错误响应时,响应
Content-Type为text/html,不符合预期的JSON格式要求 - 已尝试在请求头添加
REST-Framework-Version: 4参数,错误响应仍为HTML格式,未返回JSON - 运行环境:Oracle APEX 21.1、Oracle ORDS 21
异常响应示例
基础信息
- 状态码:400
- 请求耗时:79ms
- 响应大小:23字节
响应头
api_status_code: SIM400-05 connection: close content-type: text/html;charset=UTF-8 date: Mon, 13 Jun 2022 14:31:15 GMT transfer-encoding: chunked x-ords_debug: false
响应正文
Invalid Account Number
解决方案
这是ORDS 21.x版本的默认行为导致的:当Handler逻辑先设置错误状态码、未显式指定响应MIME类型时,ORDS会将请求转发到内置servlet错误页,强制渲染为text/html格式,和请求头携带的REST-Framework-Version参数无关。按以下方式调整Handler逻辑即可返回JSON格式错误:
- 调整PL/SQL处理逻辑的执行顺序,不要在输出响应内容前提前设置400状态码
- 检测到错误场景时,先显式设置响应MIME类型:
owa_util.mime_header('application/json', true, 'UTF-8'); - 构造符合要求的JSON格式错误响应体,通过
htp.p()输出完整内容,示例:htp.p(json_object( 'code' value 'SIM400-05', 'message' value 'Invalid Account Number' )); - 最后通过ORDS隐式绑定变量
:status_code设置为400,完成响应返回。
额外注意:如果是在APEX中定义的REST Handler,不要使用apex_error.add_error这类原生APEX错误抛出接口返回自定义错误,这类接口触发的框架级错误会被ORDS强制拦截,走默认HTML错误页逻辑,自定义业务错误必须按上述流程手动输出响应内容后再设置状态码。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

