此问题涉及XML 1.0和HTTP 1.1建议之间的相互作用。
我有一个Web服务,它接受格式良好的XML 1.0文档,对其进行解析,然后将其重新序列化回客户端。该服务支持内容类型text/xml
和application/xml
。
假设以Content-Type: text/plain; charset=us-ascii
和Accept: text/plain
Accept-Charset: us-ascii
提交了以下文件:
<?xml version="1.0" encoding="UTF-8" ?>
<x>Inhoffenstraße</x>
上述文档格式正确,符合编码要求。
解析后,XML DOM为UTF-8。由于文档的编码也是UTF-8,因此文档将被重新序列化为:
<?xml version="1.0" encoding="UTF-8" ?>
<x>Inhoffenstraße</x>
上述文档与Accept-Charset
标题不兼容。但是,至少有三种方式可以满足此要求:
使用编码US-ASCII序列化DOM。这似乎是错误的和不必要的,因为我正在更改文档的基本属性,这可能会误导客户端(例如,这可能会破坏应用程序层的某些内容,即ESB / SOAP):
<?xml version="1.0" encoding="US-ASCII" ?>
<x>Inhoffenstraße</x>
通过将非ASCII字符替换为其Unicode字符引用,对服务层中的序列化UTF-8进行后处理。这感觉就像一个黑客,因为正在使用非XML知晓的字符串转换对整个文档执行特定于XML的字符编码:
<?xml version="1.0" encoding="UTF-8" ?>
<x>Inhoffenstraße</x>
将服务层中的请求拒绝为406 Not Acceptable
。这将假设encoding="UTF-8"
与Accept-Charset: us-ascii
冲突。但是,我不认为是这种情况,因为请求的实际内容完全由ASCII字符组成。
响应的预期,符合标准的行为是什么?根据我对参考标准的理解,上述任何一种都可以接受。
以下对不同问题的回答提供了一些有用的信息,但没有具体解决text/xml
案例:
application/* Content-Type and charset attributes
我正在链接以下问题,因为我认为它源于一个相关的问题:
Escaping unicode string in XmlElement despite writing XML in UTF-8
答案 0 :(得分:2)
由于支持的媒体类型(文本/ xml,应用程序/ xml)与请求中有效负载的媒体类型(文本/纯文本)之间的冲突,因此,本演示场景的符合标准的响应为415不支持的媒体类型
Content-Type在RFC7231 Section 3.1.1.5中的定义如下(强调我的意思):
“ Content-Type”标头字段指示 相关的表示形式: 消息有效负载或选定的表示形式,由 消息语义。指示的媒体类型定义了两个数据 格式和收件人打算如何处理数据, 在任何内容之后的接收到的消息语义范围内 由Content-Encoding指示的编码被解码。
由于有效载荷的媒体类型是文本/纯文本,因此我们必须将提交的文档处理为纯文本(“打算如何处理该数据”)。
那么我们如何处理纯文本? 纯文本在RFC2046 Section 4.1中的定义如下:
纯文字不提供或不允许 格式化命令,字体属性规范,处理 说明,解释指令或内容标记。平原 文本仅被视为线性字符序列,可能 被换行符或分页符中断。
XML定义内容标记,处理指令和其他内容。 将纯文本文档解析为XML,违反了标准。
让我们看看您的示例:
<x>Inhoffenstraße</x>
如果文档是XML,则将ß
转换为ß
,
但是如果文档是纯文本,则违反RFC2046,也违反了RFC5147,该文本确认应如何处理纯文本。
作为纯文本,ß
的意思是ß
,
总而言之,您提出的上述所有可能回应都不符合标准。 所提出方案的符合标准的响应是415不支持的媒体类型。