我们有一个RESTful架构,我对API的异常和http状态有疑问。
我们对案例使用400
:
对于逻辑错误但不是客户端错误的情况,请使用422
(不可处理的实体)。例如,尝试将类别设置为已有的类别。这在客户端是不可预测的。
最后,我们使用409
(冲突)作为客户端错误的情况。
例如,如果他试图通过Date
发送无效的JSON
格式。或者注册日期在当前之前很远。
但有一个案例适用于几个类别:
我们有一个Tax
字段,它是整数。
如果客户端发送小数 Tax
,则应抛出异常。
从一方面来看,这显然是400
,客户应该看到'税不能分数'。
但是,从另一方面来说 - 这是客户的程序员错误,因为他试图发送 Double / Float 而不是 整数/长 (即他发送另一个类型,就像传递 Long 而不是 String ),应抛出409。
我应该在400
案例中为409
选择TypeMismatch
或Numbers
?
如果是400
,我为什么要对数字类型进行游戏,而对409
Date/String
TypeMismatch
个案件抛出// create 6 textures for the dynamic environment reflection
final int skyboxFaces=6;
final int[] textureId=new int[1];
GLES20.glGenTextures(1, textureId, 0);
skyboxTexture=textureId[0];
ShaderFactory.checkGLError("initRendering::createSkyboxTextures");
GLES20.glBindTexture(GLES20.GL_TEXTURE_CUBE_MAP, skyboxTexture);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_CUBE_MAP, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_CUBE_MAP, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_CUBE_MAP, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_CUBE_MAP, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
for(int i=0; i < skyboxFaces; i++)
{
GLES20.glTexImage2D(GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GLES20.GL_RGBA,
REFLECTION_TEX_WIDTH, REFLECTION_TEX_HEIGHT, 0, GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE, null);
ShaderFactory.checkGLError("initRendering::setSkyboxTexture(" + i + ")");
}
// create renderbuffer and bind 16-bit depth buffer
renderBuffers=new int[1];
GLES20.glGenRenderbuffers(1, renderBuffers, 0);
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, renderBuffers[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
REFLECTION_TEX_WIDTH, REFLECTION_TEX_HEIGHT);
ShaderFactory.checkGLError("initRendering::createRenderbuffer");
frameBuffers=new int[1];
GLES20.glGenFramebuffers(1, frameBuffers, 0);
// GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
// GLES20.GL_RENDERBUFFER, frameBuffers[0]);
ShaderFactory.checkGLError("initRendering::createFrameBuffer");
?
我更喜欢具有明确逻辑的答案,而不是“我认为”。这不是讨论。
答案 0 :(得分:4)
我同意基于意见的问题评论,但我也会把它扔出去:
答案 1 :(得分:0)
意见:由于类型更为基础,我会抛出409
答案 2 :(得分:0)
我不明白为什么你会409
对任何这些案件。
以下是维基百科关于400
的说法:
表示由于冲突而无法处理请求 在请求中,例如在多个情况下的编辑冲突 更新。
我会使用Date/String
作为数字类型以及{{1}}案例。
但这是个人风格的问题,只要您在整个API中保持一致,两种状态代码都是可能的。
答案 3 :(得分:0)
老实说,我更倾向于使用状态代码400
或422
作为您的用例,因为由于其内容而无法处理提供的实体。这可能是结构性的(错误的类型,缺少必需的字段,......)或数据验证(使用正则表达式的格式错误,不允许的值,重复值,......)。
状态代码409
应该用于乐观锁定,如链接http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html中所述:
10.4.10 409冲突
由于与资源的当前状态发生冲突,无法完成请求。此代码仅在预期用户可能能够解决冲突并重新提交请求的情况下才允许。响应主体应该包含足够的信息供用户识别冲突的来源。理想情况下,响应实体将包含足够的信息供用户或用户代理解决问题;但是,这可能是不可能的,也不是必需的。
最有可能发生冲突以响应PUT请求。例如,如果正在使用版本控制并且包含PUT的实体更改为与早期(第三方)请求所产生的资源冲突的资源,则服务器可能会使用409响应来指示它无法完成请求。在这种情况下,响应实体可能包含由响应Content-Type定义的格式的两个版本之间的差异列表。
希望它可以帮到你, 亨利