用于在休息端点上传文件的正确 Http 状态代码
Proper Http status codes for uploading files on rest end point
我们正在开发一个允许用户在 rest 端点上传文件的应用程序。
有人可以指导以下验证场景失败时发送 400 错误代码是否正确:
1) The Length of file name exceeds permissible limit.
2) File name contains special characters
3) Uploaded file was empty
4) The System failed to read the uploaded file from disk.
此致,
塔伦
- 文件名的长度超过允许的限制。
我认为 400
不合适,因为在这种情况下请求的语法是正确的。 422 Unprocessable Entity
在这种情况下更好。
- 文件名包含特殊字符
非法字符表示语法错误。所以 400 Bad Request
在这种情况下是一个正确的回应。有人可能声称需要非法字符的定义,以便服务器可以权威地发送 400
.
- 上传的文件为空
我认为这不是错误,因为空文件是合法文件。
- 系统无法从磁盘读取上传的文件。
系统是指服务器吗?然后服务器应该 return 一个 5xx
响应,因为它不是客户端故障。如果出现一般读取错误,服务器应该 return 500
.
编辑:
上传的文件为空。
当应用程序语义禁止空文件时,400
或 422
是合适的。有关它们的更多详细信息,请访问 400 vs 422 response to POST of data
4xx 状态用于 client-side 错误,5xx 用于 server-side 错误。因此,通常情况下 1) 到 3) 需要 4xx 代码,而 4) 应该是 5xx 错误。
我们先说对于您的情况 4),一个简单的 HTTP 500 似乎是合适的。如果你想表明客户端可以稍后重试,HTTP 503会更合适。
现在针对 1) 到 3): 根据 RFC 2616,HTTP 400 indicates syntax errors; this would usually be protocoll errors, e.g. invalid headers. Semantical or payload errors aren’t really defined in this generic RFC, however, (as Zaboj mentions) WebDAV 提供 HTTP 422,这看起来很合适,尽管它并不真正适用于通用 HTTP。
最后,您发送哪些特定代码并不重要。如果您的上传失败并显示 HTTP 400 或 422,无论哪种情况,客户端都会执行一些错误例程(例如显示或记录错误消息)。
重要的是要知道一些代码可以触发客户端行为(例如 HTTP 401 与某些 headers 结合可以触发浏览器中的身份验证对话框),您应该了解这些副作用.
在我看来,在响应中发送有用的错误描述 body 以帮助客户端解决问题比找到“完美”的 HTTP 状态代码重要得多。我知道 REST 狂热者会不同意,但他们中的 none 能够为您提供适用于每种情况的正确 HTTP 状态代码。
也就是说,如果你想发出 fine-grained 错误 codes/messages 进行自动处理,你可以引入自定义 HTTP header 字段,例如
X-MyApp-Error-Code: 2.1.6
X-MyApp-Error-Message: The uploaded file is empty
然后您将提供文档 and/or SDK,它向您的 API 消费者显示 X-MyApp-Error-Code
所有可能的错误代码值。
我们正在开发一个允许用户在 rest 端点上传文件的应用程序。
有人可以指导以下验证场景失败时发送 400 错误代码是否正确:
1) The Length of file name exceeds permissible limit.
2) File name contains special characters
3) Uploaded file was empty
4) The System failed to read the uploaded file from disk.
此致, 塔伦
- 文件名的长度超过允许的限制。
我认为 400
不合适,因为在这种情况下请求的语法是正确的。 422 Unprocessable Entity
在这种情况下更好。
- 文件名包含特殊字符
非法字符表示语法错误。所以 400 Bad Request
在这种情况下是一个正确的回应。有人可能声称需要非法字符的定义,以便服务器可以权威地发送 400
.
- 上传的文件为空
我认为这不是错误,因为空文件是合法文件。
- 系统无法从磁盘读取上传的文件。
系统是指服务器吗?然后服务器应该 return 一个 5xx
响应,因为它不是客户端故障。如果出现一般读取错误,服务器应该 return 500
.
编辑:
上传的文件为空。
当应用程序语义禁止空文件时,400
或 422
是合适的。有关它们的更多详细信息,请访问 400 vs 422 response to POST of data
4xx 状态用于 client-side 错误,5xx 用于 server-side 错误。因此,通常情况下 1) 到 3) 需要 4xx 代码,而 4) 应该是 5xx 错误。
我们先说对于您的情况 4),一个简单的 HTTP 500 似乎是合适的。如果你想表明客户端可以稍后重试,HTTP 503会更合适。
现在针对 1) 到 3): 根据 RFC 2616,HTTP 400 indicates syntax errors; this would usually be protocoll errors, e.g. invalid headers. Semantical or payload errors aren’t really defined in this generic RFC, however, (as Zaboj mentions) WebDAV 提供 HTTP 422,这看起来很合适,尽管它并不真正适用于通用 HTTP。
最后,您发送哪些特定代码并不重要。如果您的上传失败并显示 HTTP 400 或 422,无论哪种情况,客户端都会执行一些错误例程(例如显示或记录错误消息)。
重要的是要知道一些代码可以触发客户端行为(例如 HTTP 401 与某些 headers 结合可以触发浏览器中的身份验证对话框),您应该了解这些副作用.
在我看来,在响应中发送有用的错误描述 body 以帮助客户端解决问题比找到“完美”的 HTTP 状态代码重要得多。我知道 REST 狂热者会不同意,但他们中的 none 能够为您提供适用于每种情况的正确 HTTP 状态代码。
也就是说,如果你想发出 fine-grained 错误 codes/messages 进行自动处理,你可以引入自定义 HTTP header 字段,例如
X-MyApp-Error-Code: 2.1.6
X-MyApp-Error-Message: The uploaded file is empty
然后您将提供文档 and/or SDK,它向您的 API 消费者显示 X-MyApp-Error-Code
所有可能的错误代码值。