2011-07-13 121 views
1

我工作的公司已开始创建RESTful服务,其中大部分开发外包。来自浏览器的REST身份验证表示

我们的第一项服务是用于用户认证。当用户输入了不正确的用户名和密码浏览器接收200一个状态码和应答体表示为:

{ 
    "state": "FAILED", 
    "responseCode": 400, 
    "timestamp": 1310378271300, 
    "anies": [ 
     { 
      "errorCode": "-6600", 
      "errorType": "MSG_ERR_EMPTY_ACCOUNT_API_KEY", 
      "translation": { 
          "lang": "en", 
          "value": "Provided login is empty" 
         }, 
      "property":"apiKey" 
     }, 
     { 
      "errorCode": "-6601", 
      "errorType": "MSG_ERR_EMPTY_ACCOUNT_API_PASSWORD", 
      "translation": { 
          "lang":"en", 
          "value":"Provided password is empty" 
         }, 
      "property": "apiPassword" 
     } 
    ] 
} 

浏览器与控制器,后者又调用的web服务进行交互。我们也会让客户直接与服务进行交互。

上面的表示包含故障状态(400),一个内部错误代码,因此服务的客户端可以查找特定语言中的错误以及浏览器将用于显示的错误的翻译在屏幕上。 “属性”属性是错误对应的表单元素/参数。

这对我来说感觉不正确。

  1. 浏览器是否应该收到状态码400,然后查看表示失败的原因?
  2. 是否应该有翻译文本的属性,或者如果accept头是en,fr等,文本已经被翻译是否合理?
  3. 还有什么人可以建议吗?

谢谢

+0

我已经在REST用户组上发布了同样的问题,如果其他人想要关注 - http://tech.groups.yahoo.com/group/rest-discuss/message/17606 –

回答

0

400代表一个错误的请求(参见here)。在这种情况下使用不正确,请求没有问题,只是用户未经过验证。我将返回响应代码200与上面列出的详细信息。

1

请参阅答案here为什么400响应可能是要走的路。

更大的问题是状态码作为内容的一部分返回。我认为为API调用返回适当的400状态会更有意义,并返回内容中错误的详细信息。另外,我认为你说得对,包含一个Accept-Language头文件并以所需语言返回内容更有意义。

+0

谢谢John。即使验证失败,您是否认为*浏览器*仍然可以接收状态200? –

+0

我不会在这里声称有正确的答案,但我在浏览器中执行此操作的方式是使用闪光消息重定向到引用的URL。所以我在重定向后最终得到了200。我认为这对于应用程序流程而言比做400更好,但其他人可能在这里有更好的想法。 –

+0

在这里,我只谈论一个直观的HTML浏览器体验。对于浏览器内的Ajax调用,我会做正常的400状态并使用javascript处理它。 –

1

该服务不应返回http状态:200 ok,因为出现错误。它必须返回错误状态代码:

  • 400 bad request表示请求格式错误,例如没有发送用户名。
  • 401 unauthorized表示用户名和密码不匹配,登录失败或需要权限的其他页面上,这意味着您必须先登录。
  • 403 no permission表示您已经登录,但您无权访问当前页面。

REST只有错误处理的状态代码建议,所以您在响应主体中返回的所有内容都可能取决于应用程序。随意使用responseCode: 400作为您的错误消息格式,如果您对此感到高兴......

+1

SPOT ON!对于REST api,永远不会返回200:OK状态,除非它真的全部OKAY ...当不确定某些东西肯定是错误的时候,不要再使用HTTP了,请返回适当的4XX状态代码。 – vanHoesel

+0

@vanHoesel我完全同意。 http://www.brandsoftheworld.com/sites/default/files/styles/logo-thumbnail/public/102011/like_icon.png?itok=nkurUMlZ – inf3rno