【问题标题】:Passing JSON error responses via HTTPD通过 HTTPD 传递 JSON 错误响应
【发布时间】:2014-06-09 02:47:54
【问题描述】:

与我合作的团队正在为他们的应用程序创建一个 API 接口,以便向需要它的网站公开数据。他们以 JSON 格式发送请求和响应,但目前在以下问题上受到阻碍。

他们编写了 API 来响应缺少所需数据并带有 422 错误代码的请求:

422 无法处理的实体 (WebDAV; RFC 4918) - 请求是 格式良好,但由于语义错误而无法遵循。

请求得到处理并从应用服务器返回一个有效的 JSON 响应对象,但 HTTPD 服务器当前正在拦截响应并将通用 ErrorDocument 放入 422 错误。

想看看有没有办法:

  1. 禁用 ErrorDocument 拦截,只通过 Apache 服务器透明地从应用服务器返回 JSON 响应
  2. 使用 ErrorDocument 处理程序,但将响应正文注入到返回的消息中 - 即

    错误文档 422 ${RESPONSE_BODY}

欢迎提出任何其他建议。我们的临时解决方案只是返回 200 响应并在响应中定义错误代码,但如果可能,宁愿使用 HTTP 错误代码。

【问题讨论】:

  • 现在提供答案,但您能否提供 API 设置的示例路径。您不需要使用真正的域/主机,但结构概述会很好。

标签: json apache intercept


【解决方案1】:

在不知道您的 API 的 URL 结构的情况下,我会建议类似于我在我创建的使用 PHP 作为框架的 JSON API 中使用的东西。将其放在服务器或 Web 应用程序根目录上的 .htaccess 文件中。

ErrorDocument  422     /error/422

它的作用是将任何422 错误发送到/error/422 的URL 路径。这是假设您的服务器设置如下:

http://api.mygreatserver.net/error/422

我的.htaccess 中也有一条规则,它可以像这样路由流量:

RewriteRule     ^([a-z_-]+)/([0-9]+)/?$   index.php?controller=$1&id=$2 [QSA]

所以基本上/error/422 在幕后转换为index.php?controller=error&id=422。 PHP 脚本路由到error,然后error 作用于422……等等,瞧!

如果 API 本身以某种方式定位为域的路径,如下所示:

http://www.mygreatserver.net/api/error/422

它可能是这样的:

ErrorDocument  422     /api/error/422

一般目标是将任何422 发送到您控制范围内的预定路径。然后在该控制器中,您可以发送任何您想要的自定义内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多