You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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格式错误:

  1. 调整PL/SQL处理逻辑的执行顺序,不要在输出响应内容前提前设置400状态码
  2. 检测到错误场景时,先显式设置响应MIME类型:
    owa_util.mime_header('application/json', true, 'UTF-8');
    
  3. 构造符合要求的JSON格式错误响应体,通过htp.p()输出完整内容,示例:
    htp.p(json_object(
        'code' value 'SIM400-05',
        'message' value 'Invalid Account Number'
    ));
    
  4. 最后通过ORDS隐式绑定变量:status_code设置为400,完成响应返回。

额外注意:如果是在APEX中定义的REST Handler,不要使用apex_error.add_error这类原生APEX错误抛出接口返回自定义错误,这类接口触发的框架级错误会被ORDS强制拦截,走默认HTML错误页逻辑,自定义业务错误必须按上述流程手动输出响应内容后再设置状态码。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:03:15