Protocol Buffer MIME 类型

Protobuf 序列化的标准 MIME 类型。

根据标准,所有 Protobuf 文档的 MIME 类型应为 application,子类型为 protobuf。对于 JSON 编码,应加上 +json 后缀,并附带以下参数。

  • encoding 只能设置为 binaryjson,分别表示相应的格式。
    • 对于子类型 protobuf+jsonencoding 的默认值为 json,且不能设置为 binary。对于子类型 protobuf(不带 +json),encoding 的默认值为 binary,且不能设置为 json
    • 即使在 HTTP 响应中使用解析器断路器 (parser breakers) 作为 CORB 缓解措施,对于 JSON 也应使用 +json
  • 对于所有 JSON 或文本格式 (Text Format) 的编码,将 charset 设置为 utf-8,并且绝不要为二进制编码设置它。
    • 如果未指定 charset,则假定为 UTF-8。建议始终指定 charset,因为当 proto 用于 HTTP 响应时,这可以防止某些攻击向量。
  • Protobuf 保留了 version 参数,以备将来对我们的线路格式进行版本控制。在线路格式进行版本控制之前,请不要设置它。

因此,常见的 Protobuf 编码的标准 MIME 类型是:

  • application/protobuf 用于序列化的二进制 proto。
  • application/protobuf+json; charset=utf-8 用于 JSON 格式的 proto。

读取 Protobuf 的服务也应处理 application/json,它可能被用来编码 JSON 格式的 proto。

如果 MIME 参数(encodingcharsetversion)具有未知或非法值,解析器必须失败。

当二进制 proto 通过 HTTP 传输时,Protobuf 强烈建议对其进行 Base64 编码,并设置 X-Content-Type-Options: nosniff 以防止 XSS,因为 Protobuf 有可能被解析为活动内容。

如果需要,可以向这些 MIME 类型传递额外的参数,例如指示内容模式的类型 URL;但 MIME 类型参数绝不能包含编码选项。