REST服务中Content-Type未定义/不符场景的请求合法性问询
前提依据
根据HTTP 1.1规范,Content-Type请求头为可选字段,相关规则如下:
任何包含实体主体的HTTP/1.1消息都应包含Content-Type头字段以定义主体的媒体类型。当且仅当未通过Content-Type字段指定媒体类型时,接收方可尝试通过检查内容和/或用于标识资源的URI的名称扩展名来猜测媒体类型。如果媒体类型仍未知,接收方应将其视为"application/octet-stream"类型。
问题与判定结论
Swagger文件定义了Content-Type,但请求未携带该头字段
判定为错误请求。Swagger作为服务对外的契约,明确指定Content-Type意味着服务端要求请求严格遵循该约定。尽管HTTP 1.1规范允许缺省该字段,但此时请求违反了服务预先定义的契约,服务端应返回400 Bad Request类错误。Swagger文件未定义Content-Type,但请求携带了该头字段
判定为合法请求。Swagger未定义说明服务端对Content-Type无强制约束,只要请求携带的Content-Type符合HTTP规范且服务端能处理对应媒体类型,就应视为合法。HTTP 1.1规范本身允许携带该字段,服务端可按规范正常处理或采用默认逻辑解析。Swagger文件定义了Content-Type,但请求携带了不同的Content-Type值
判定为错误请求(与你的判断一致)。Swagger定义的Content-Type是服务端明确接受的媒体类型,请求携带不匹配的值违反了契约,服务端无法正确解析请求体,应返回415 Unsupported Media Type错误。
内容的提问来源于stack exchange,提问作者osama yaccoub

