在RESTful API中返回HTTP状态代码的最佳做法是什么?我正在使用Laravel 4作为我的 PHP框架.

在出现错误的情况下,应该使用

return Response::json('User Exists',401);

要么

包括成功的旗帜

return Response::json([
    'success' => false,'data' => 'User Exists'],401
);

要么

使用200而不是4xx,依靠成功来确定是否有错误

return Response::json([
    'success' => false,200
);

在成功的情况下,没有必要返回任何数据,你还会返回任何东西吗?

PHP API代码

public function getCheckUniqueEmail() {
    // Check if Email already exist in table 'users'
    $uniqueEmail = checkIfEmailExists();

    // Return JSON Response
    if($uniqueEmail) {
        // Validation fail (user exists)
        return Response::json('User Exists',401);
    } else {
        // Validation success
        // - Return anything?
    }
}
当你看着 list of available HTTP status codes时,你会在某种程度上意识到有很多,但是单独使用它们本身并不能真正解释一个错误.

所以要回答你的问题,有两个部分.一个是:您的API如何传达错误的原因,并添加API的用户(大多数情况下是另一个开发人员)可以阅读并采取行动的有用信息.您应该添加尽可能多的信息,包括机器可读性和可读性.

另一部分:HTTP状态代码如何帮助区分某些错误(和成功)状态?

后一部分实际上比一个人更难.有很多情况下,404被用来告诉“未找到”.而对于服务器端的任何错误都是500.

我不会使用状态401,除非我真的想允许操作成功,如果存在HTTP身份验证凭据. 401通常在浏览器中触发一个对话框,这是坏的.

如果资源来源是唯一的并且已经存在,状态“409冲突”似乎是适当的.如果创建用户成功,状态“201 Created”也听起来像个好主意.

请注意,有更多的状态代码,其中一些与HTTP协议(如DAV)的扩展有关,一些完全不标准(像Twitter API的状态“420增强您的冷静”).看看http://en.wikipedia.org/wiki/List_of_HTTP_status_codes,看看到目前为止已经使用了什么,并决定是否要使用适合你的错误情况的东西.

根据我的经验,很容易选择状态代码并使用它,但是很难按照现有的标准一致地执行.

不过,我不会因为其他人的抱怨而停在这里. :)正确的RESTful接口本身就是一项艰巨的任务,但存在的接口越多,收集的经验就越多.

编辑:

关于版本控制:把一个版本的标签放入网址是不好的做法,像这样:example.com/api/v1/stuff它会工作,但不是很好.

但首先是:你的客户如何指定他想要获得哪种表示,即他如何决定要获得JSON或XML?答案:使用Accept标题.他可以发送Accept:application / json for JSON和Accept:application / xml for XML.他甚至可以接受多种类型,而服务器可以决定要返回的内容.

除非服务器被设计为使用资源的多个表示(JSON或XML,客户端选择)来回答,否则客户端真的没有太多的选择.但是客户端至少发送“application / json”作为他唯一的选择仍然是一件好事,然后返回一个头部Content-type:application / json作为响应.这样一来,双方就会明确他们期望对方看到的内容.

现在为版本.如果您将版本放入网址,您可以有效地创建不同的资源(v1和v2),但实际上只有一个资源(= URL)具有不同的方法来访问它.当请求的参数和/或与当前版本不兼容的响应中的表示发生突然变化时,必须创建新版本的API.

因此,当您创建使用JSON的API时,不会处理通用JSON.你处理一个具体的JSON结构,这是你的API特有的.您可以并且可能应该在服务器发送的Content-type中指示. “供应商”扩展是这样的:内容类型:application / vnd.IAMvendOR.MYAPI json将告诉世界基本数据结构是application / json,但它是您的公司和您的API真正地告诉哪个结构期望.而且这正是API请求的版本适用于:application / vnd.IAMvendOR.MYAPI-v1 json.

因此,您不需要将该版本放在URL中,您希望客户端发送Accept:application / vnd.IAMvendOR.MYAPI-v1 json标头,并以Content-type:application / vnd.IAMvendOR.MYAPI-v1 json作为响应好.这真的改变了第一个版本,但是让我们看看当版本2发挥作用时,事情如何发展.

URL方法将创建一个完全无关的新资源.客户端会想知道example.com/api/v2/stuff是否与example.com/api/v1/stuff资源相同.客户端可能已经使用v1 API创建了一些资源,并且他存储了这些东西的URL.他应该如何将所有这些资源升级到v2?资源真的没有改变,他们是一样的,唯一改变的是它们在v2中看起来不一样.

是的,服务器可能会通过将重定向发送到v2 URL来通知客户端.但重定向并不表示客户端还必须升级客户端部分的API.

当使用带有该版本的accept标头时,资源的URL对于所有版本都是相同的.客户端决定使用版本1或2请求资源,并且服务器可能是如此友善,仍然以版本1响应来解答版本1请求,但是所有版本2请求都带有新的和闪亮的版本2响应.

如果服务器无法应答版本1请求,他可以通过发送HTTP状态“406不可接受”来通知客户端(所请求的资源只能根据请求中发送的Accept标头生成不能接受的内容).

客户端可以发送包含两个版本的accept标头,这使得服务器能够以最喜欢的方式进行响应,即,智能客户端可能会实现版本1和2,现在同时发送为接收头,并等待服务器升级从版本1到2.服务器将在每个响应中告诉它是否是版本1或2,并且客户端可以相应地采取行动 – 他不需要知道服务器版本升级的确切日期.

总结一下:对于一个非常基本的API,有限的,也许是内部的使用,即使有一个版本可能是过度的.但你永远不知道这是否会在一年之后成真.将版本号添加到API中总是一个很好的主意.而最好的一点是你的API即将使用的mime类型.检查单个现有版本应该是微不足道的,但是您可以选择稍后进行透明升级,而不会混淆现有客户端.

php – RESTful API中错误的最佳实践的更多相关文章

  1. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  2. ios – 我可以使用哪些iPhone OS API来实现类似于iBook页面翻转过渡的过渡动画?

    >UIKitAPI中的某个地方是否可以使用该动画,还是我必须自己实现?它肯定有3D感觉,他们可以使用OpenGLESAPI吗?解决方法Apple当然使用OpenGLES来实现它.Apple使用的实际API是私有的,但thisblogger具有示例代码的实现的开始.

  3. iOS 7,用于断开调用的私有API CTCallDisconnect不起作用

    谢谢!

  4. 我应该使用哪个高级API来管理iOS上的UDP套接字?

    在“NetworkProgrammingTopicsConceptualGuide”的“UsingSocketsandStreams”一章中,Apple说:Note:POSIXnetworkingdoesnotactivatethecellularradiooniOS.Forthisreason,thePOSIXnetworkingAPIisgenerallydiscouragediniOS.同样

  5. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  6. ios – 尝试向我们分配IP而不是localhost或home时,NSURLSession失败

    我有一台本地运行的服务器(我的IP是192.168.0.98),并且已经尝试使用一些网络代码来访问它.最初这是通过AFNetworking完成的,但我现在用这样的NSURLSession完成了它:然后我用这3个URL运行它:>http://localhost:8080/api–>作品.>http://127.0.0.1:8080/api–>作品.>http://192.168.0.98:8080/

  7. 适用于iOS的Google云端硬盘实时API

    我想使用GoogleDrive和新的实时API在我的iOS应用中实现实时协作.我知道我可以在Objective-C中设置一个Web视图,并在Web视图和我的本机应用程序之间建立双向通信,因此使用javascript库,但我担心这对于高容量来说效率低下数据流量.我希望可能会有一个原生的解决方案即将出现.有关Objective-C的GoogleApi客户端库是否会更新以包含Google云端硬盘实时API的任何消息?

  8. ios – 如何通过iPhone中的Graph API在Facebook上“喜欢”和“评论”?

    我正在使用图形api显示新闻源.我对以下问题有疑问.>我想为每个新闻提要帖子提供“赞”功能.>我想为每个新闻提要帖子提供“评论”功能.有人可以帮助我如何使用iPhone中的图形API来解决这个问题.解决方法请参考我的答案:HowtocommentorlikeaphotoinfacebookthroughFBconnectorGraphAPIiniPhoneSDK?只需将您的访问令牌发送到https

  9. ios – 使用带有OAuth 2.0的Google API在iPhone中登录Gmail

    我找到了Google提供的服务,可以访问各种Google服务的GoogleApi.我可以在iPhone中设置一个项目,并为iOS应用程序和本机应用程序创建API访问.我想为我的iPhone应用程序使用本机API.它API为我提供了电子邮件,全名,名字,姓氏,google_id,性别,dob,profile_image.如何在我的iPhone应用程序,任何示例应用程序,可用的代码段中使用这些?

  10. ios – 如何使用YouTube API V3?

    我想知道如何在iOS应用中使用新的YouTubeAPI(第3版),但我不知道如何做.我做了很多关于它的研究,但是我发现所有的例子和老API的代码,所以它们是无效的.现在,我明白了,使用新的API你必须在Google开发者控制台中创建一个项目…使用API2很简单它…

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部