Appendix B. HTTP Problems and XML (HTTP 问题与 XML)
使用 XML [XML] 的基于 HTTP 的 API 可以使用本附录中定义的格式表达问题详情。
XML 格式的 RELAX NG 模式 [ISO-19757-2] 为:
default namespace ns = "urn:ietf:rfc:7807"
start = problem
problem =
element problem {
( element type { xsd:anyURI }?
& element title { xsd:string }?
& element detail { xsd:string }?
& element status { xsd:positiveInteger }?
& element instance { xsd:anyURI }? ),
anyNsElement
}
anyNsElement =
( element ns:* { anyNsElement | text }
| attribute * { text })*
请注意, 此模式仅用作文档, 而不是捕获 XML 格式所有约束的规范性模式。可以使用其他 XML 模式语言来定义类似的约束集 (取决于所选模式语言的功能)。
此格式的媒体类型为 "application/problem+xml"。
扩展数组和对象通过将包含一个或多个子元素的元素视为对象来序列化为 XML 格式, 但仅包含一个或多个名为 "i" 的子元素的元素除外, 它们被视为数组。例如, 上面的示例在 XML 中显示如下:
HTTP/1.1 403 Forbidden
Content-Type: application/problem+xml
Content-Language: en
<?xml version="1.0" encoding="UTF-8"?>
<problem xmlns="urn:ietf:rfc:7807">
<type>https://example.com/probs/out-of-credit</type>
<title>You do not have enough credit.</title>
<detail>Your current balance is 30, but that costs 50.</detail>
<instance>https://example.net/account/12345/msgs/abc</instance>
<balance>30</balance>
<accounts>
<i>https://example.net/account/12345</i>
<i>https://example.net/account/67890</i>
</accounts>
</problem>
此格式使用 XML 命名空间, 主要是为了允许将其嵌入到其他基于 XML 的格式中; 它并不意味着可以或应该使用其他命名空间中的元素或属性对其进行扩展。RELAX NG 模式明确仅允许来自 XML 格式中使用的一个命名空间的元素。任何扩展数组和对象都必须 (MUST) 仅使用该命名空间序列化为 XML 标记。
使用 XML 格式时, 可以在 XML 中嵌入 XML 处理指令, 该指令指示客户端使用引用的 XSL 转换 (XSLT) 代码 [XSLT] 转换 XML。如果此代码将 XML 转换为 (X)HTML, 则可以提供 XML 格式, 但仍使能够执行转换的客户端显示在客户端呈现和显示的人性化 (X)HTML。请注意, 使用此方法时, 建议使用 XSLT 1.0 以最大化能够执行 XSLT 代码的客户端数量。