Servlet返回空卡片时,应选用何种HTTP响应码避免浏览器错误?
关于HTTP状态码的两个问题解答
问题1:无效HTTP响应应使用何种状态码?
首先得区分「无效」是客户端问题还是服务器问题:
- 如果是客户端请求本身无效(比如参数格式错误、请求体不符合要求、URL拼写错误),优先用
400 Bad Request;要是请求的资源不存在,就用404 Not Found;如果用户没有权限访问目标资源,选403 Forbidden;未登录/未授权的场景则用401 Unauthorized。这些都属于4xx系列,代表客户端触发的错误。 - 如果是服务器端处理时出了问题(比如数据库连接失败、代码抛出异常),那用
500 Internal Server Error;要是服务器作为网关收到了上游的无效响应,用502 Bad Gateway;服务器暂时过载无法处理请求的话,用503 Service Unavailable。这些是5xx系列,属于服务器端错误。
简单总结:4xx是客户端的问题,5xx是服务器的问题,根据具体的无效场景选对应状态码就好。
问题2:空卡片数据场景下的合适状态码
你的场景特别明确:请求完全合法,只是数据库里还没有卡片数据,既不想用4xx错误码(会触发浏览器错误提示),又想和正常返回数据的200状态区分开。
我推荐你用 204 No Content 这个状态码:
- 它属于2xx成功系列,浏览器不会把它当成错误处理,完美避开你说的405那种触发错误提示的问题;
- 它的语义就是「服务器成功处理了请求,但没有返回任何内容」,刚好匹配你“没有卡片数据”的场景——请求没问题,只是没数据可返回。
具体实现的话,在你的Servlet里可以这么写:
// 当检测到卡片数据为null时 response.setStatus(HttpServletResponse.SC_NO_CONTENT); // 等价于设置状态码204
然后在前端jQuery Ajax里,你可以通过状态码判断来弹出提示:
$.ajax({ url: '你的Servlet路径', type: 'GET', success: function(data, textStatus, xhr) { if (xhr.status === 204) { alert('还没有添加任何卡片哦~'); } else { // 正常处理返回的卡片数据 } }, // 因为204是成功状态,不会进入error回调,所以不用在这里处理 });
为什么不推荐其他码?比如200带空响应体?当然也可以,但你想要用状态码来区分,204的语义更精准,能直接通过状态码判断场景,不用再解析响应体,逻辑更清晰。而4xx系列(比如你试过的405)语义不对——405是请求方法不允许,但你的请求方法是对的,只是没数据,用4xx会误导浏览器和开发者,还触发错误提示,完全没必要。
内容的提问来源于stack exchange,提问作者MadMax
相关产品推荐
相关产品推荐

