受到思考的启发,同时查看" 资源可用但由于权限无法访问时纠正HTTP状态代码 "这一问题,我将使用相同的方案来说明我的假设问题.
想象一下,我正在建立一个拼车网络服务.
假设如下
GET /api/persons/angela/location
Run Code Online (Sandbox Code Playgroud)
检索用户"angela"的当前位置.只有angela本人和可能会选择她的司机应该能够知道她的位置,因此如果请求未通过相应用户的身份验证,则会返回401 Unauthorized响应.
还要考虑请求
GET /api/persons/john/location
Run Code Online (Sandbox Code Playgroud)
当没有用户名为john时已在系统中注册.没有john资源,更不用说john位置的资源了,所以这显然会返回404 Not Found.或者是吗?
如果我不想透露john是否在系统中注册了怎么办?
(也许用户名来自一小部分大学登录,校园内有一个非常激进的自行车小组,即使你在拼车,也会对车辆的使用情况非常暗淡?他们可以为每个用户提出URL请求,如果他们收到的是401而不是404,则推断出该用户是汽车用户)
为此请求返回401 Unauthorized是否有意义,即使资源不存在且服务器返回200的请求中没有可能提供的凭据集?
我读了如果请求缺少必需参数,我应该使用什么HTTP状态响应代码?但它没有具体询问标题,似乎没有达成共识.
此问题的上下文假定验证成功.我目前偏爱400(虽然这感觉不对,因为这不是"格式错误的语法")或403.鉴于403的描述:
服务器理解请求,但拒绝履行请求.授权无效,请求不应重复.如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因.
这对我来说最有意义.
有人可以赐教吗?谢谢.
http-status-codes http-headers http-status-code-403 http-status-code-400
场景:
甲POST请求被发送到处理,这将导致数据检索来自外部数据源的命令.
有三种可能的结果:
对1的明显响应是200: OK或201: Created(从此请求创建实体).
什么状态代码适合2和3?
我考虑的状态代码:
503: Service Unavailable 当数据源关闭时500: Internal Server Error 当数据源关闭时502: Bad Gateway 什么时候"没有数据可用"404: Not Found 什么时候"没有数据可用"403: Forbidden 什么时候"没有数据可用"412: Precondition Failed 什么时候"没有数据可用"我想要做的就是404从PHP 发送状态代码 - 但是以通用的方式.双方Router::statusCode(404)并Router::statusCode(403)应工作,以及任何其他有效的HTTP状态代码.
我知道,您可以将状态代码指定为第三个参数header.可悲的是,这只有在你指定一个时才有用string.因此,呼吁header('', false, 404)并没有工作.
此外,我知道,可以通过header状态行的呼叫发送状态代码:header('HTTP/1.1 404 Not Found')
但要做到这一点,我必须Not Found为所有状态代码(404)维护一系列原因短语().我不喜欢这个想法,因为它在某种程度上是PHP已经完成的重复(对于第三个header参数).
所以,我的问题是:有没有简单而干净的方式在PHP中发送状态代码?
在控制器中我创建了json数组.如果我退货List<JSONObject>就可以了:
@RequestMapping(value="", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<JSONObject> getAll() {
List<Entity> entityList = entityManager.findAll();
List<JSONObject> entities = new ArrayList<JSONObject>();
for (Entity n : entityList) {
JSONObject entity = new JSONObject();
entity.put("id", n.getId());
entity.put("address", n.getAddress());
entities.add(entity);
}
return entities;
}
Run Code Online (Sandbox Code Playgroud)
但我需要返回JSON数组和HTTP状态代码:
@RequestMapping(value="", method=RequestMethod.GET, produces=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<List<JSONObject>> getAll() {
List<Entity> entityList = entityManager.findAll();
List<JSONObject> entities = new ArrayList<JSONObject>();
for (Entity n : entityList) {
JSONObject Entity = new JSONObject();
entity.put("id", n.getId());
entity.put("address", n.getAddress());
entities.add(entity);
}
return new ResponseEntity<JSONObject>(entities, HttpStatus.OK); // …Run Code Online (Sandbox Code Playgroud) 有没有办法重定向201答案?
RFC指定必须在Location标头中指定新创建的资源,并且我指定它.我假设浏览器会重定向,但它不会,即使页面没有内容.
我希望用户在POST操作后重定向到新资源.因此我很想使用,303 See Other但201似乎更合适.
那么,有没有办法在没有用户干预的情况下自动重定向流行的浏览器而不依赖于Javascript?
我知道状态代码418被定义为愚人节的笑话,并且"预计不会被实际的HTTP服务器实现",如维基百科所述.
但是如果你们中的任何人知道支持它的语言/网络服务器/ IDE,我会感兴趣.
我正在尝试Apache(通过php),显然它给我一个内部错误(500).我只是喜欢它背后的幽默(我不想在这里试图)并且想知道是否不仅仅是Emacs实现了这一点.
更确切地说:它可以在php中模拟,例如通过做类似的事情...
header("HTTP/1.1 418 Whatever text I'd like");
Run Code Online (Sandbox Code Playgroud)
...但是你们中的任何人都知道任何实际的服务器软件(或语言)本地实现它,其中类似下面的东西不会抛出500,但实际上工作:
http_response_code(418);
Run Code Online (Sandbox Code Playgroud) 例如,jQuery在发出Ajax请求时有以下两个特定的回调:
success:当200/2xx状态代码与响应一起发送时触发.
error:当4xx,5xx等状态代码返回响应时触发.
如果用户尝试创建一个新的"Person"对象,我会在成功时发回新创建的对象的JSON表示,从而允许javascript访问新对象的必要唯一ID等.当然,这会被发送拥有200状态代码.
如果用户提交格式错误或无效的数据(例如,无效/不完整的"名称"字段),我想通过JSON发回验证错误消息.(我不明白为什么这会是一件坏事).
我的问题是:这样做,我应该发送200状态代码,因为我成功处理了他们的无效数据?因此,我将使用jQuery success回调,但只是检查错误...
或者,我应该使用4xx状态代码,也许是"错误请求",因为他们发送给我的数据无效?(因此,使用error回调来执行必要的客户端通知).
如果客户端发送HTTP请求并指定无法由服务器解码的Content-Encoding标头,应返回什么状态代码?
例
客户端将JSON数据POST到REST资源,并使用gzip编码对实体主体进行编码.但是,服务器只能解码DEFLATE编码,因为它在服务器学校的gzip类失败了.
应该返回什么HTTP响应代码?我会说415不支持的媒体类型,但它不是实体的内容类型是问题 - 它是否则支持的实体主体的编码.
哪个更合适:415?400?也许是自定义响应代码?
附录:当然,我已经彻底检查了rfc2616.如果答案在那里,我可能需要一些新的矫正眼镜,但我不相信它.
更新:
这与发送可能对客户端不可接受的响应无关.问题是客户端在服务器无法理解的编码中向服务器发送可能是或可能不是有效媒体类型的服务器(根据Content-Encoding客户端与请求消息打包在一起的头部).
这是一个边缘情况,在处理浏览器用户代理时不会遇到,但它可能会在REST API中出现,接受实体主体来创建/修改资源.
我在控制器的代码中使用HTTP状态代码符号,例如:
render json: {
auth_token: user.authentication_token,
user: user
},
status: :created
Run Code Online (Sandbox Code Playgroud)
要么
render json: {
errors: ["Missing parameter."]
},
success: false,
status: :unprocessable_entity
Run Code Online (Sandbox Code Playgroud)
在我的请求规范的代码中我也想使用符号:
post user_session_path, email: @user.email, password: @user.password
expect(last_response.status).to eq(201)
Run Code Online (Sandbox Code Playgroud)
...
expect(last_response.status).to eq(422)
Run Code Online (Sandbox Code Playgroud)
但是,我使用符号而不是整数的每个测试都会失败:
Failure/Error: expect(last_response.status).to eq(:created)
expected: :created
got: 201
(compared using ==)
Run Code Online (Sandbox Code Playgroud)
以下是Rack中最新的HTTP状态代码符号列表.
http ×6
rest ×3
http-headers ×2
json ×2
ajax ×1
header ×1
httpserver ×1
java ×1
javascript ×1
php ×1
rspec ×1
security ×1
spring ×1