谁会在意 GET vs POST? NoREST!

若你曾写过 REST API,你肯定体验过那些无休止的争论,例如该使用哪个动词?该使用哪个 HTTP 状态码?该如何组织我的 URL?这些都没有正确答案。不是所有的操作都能由某个动词表示。不是所有的错误都匹配 HTTP 错误。为何我们要在 API 上使用那些为超文本设计的动词和错误码?我们使用 HTTP 作为客户端/服务端的通信方式是因为它是如此普遍,在它上面增加 REST 可能是杀鸡用牛刀了,特别当你只是想要一个简单的 API 接口。

思考这个典型的 API 在其他语言中的调用以及它是如何转化为 REST。

OrderDTO Customer::GetOrder(int customerID, int orderID)

作为一个 REST 调用应该类似这样

GET /customer/33245/order/8769

如果我们将方法名置于变量之间,那么问题就来了,该 URL 的哪部分是终点?哪些是参数?这些参数又与什么对应?很难仅仅通过 URL 推断出它是如何传递给后端的。

一个简单的 API,与我们原始的方法调用很像,没有混淆参数名称,并且清晰定义了要传递的参数

GET /customer/getOrder?customerID=33245&orderID=8769

作为一位 API 用户或是设计师,上面的 URL 更容易被理解,因为方法调用和参数被清晰的分离开来。这并不是 RESTful,但是除此之外在编程中哪里还用过如此类似 REST 的模式?有语言强制要求使用 4 个动词来修饰吗?这些真的必要吗?简单的说,这不是必要的。POST 解决一切。

REST URL 看起来『更干净』,但它们更容易被理解吗?SEO 不是必要的。当你希望扩展更多参数,或使用更加复杂的参数例如数组,这些『简单』的 URL 会让你很头疼。

GET /customer/33245/order/8769

为何不把参数从 URL 中移除?将它们放在 query string,或以 JSON 格式 POST 过去。这样子参数被显示命名,更易理解,消除了对复杂路由属性的依赖。

POST /customer/getOrder{ customerID: 33245, orderID: 8769 }错误码

为何要用为接收超文本而设计的数量有限的错误码来表示你的错误响应?

保存来自服务器自身错误的 HTTP 特定错误码。例如你得到一个 404 响应,那么它来自服务器还是你的应用程序?一个简化的 API 可能在成功时返回 HTTP 200 ,在遇到错误时返回 500 和应用级错误码。

这些代码可以是为业务定制的(订单未找到,摄像头未找到,数据库跪了,已打包等等)。代码可以是唯一以方便追溯。测试中结合特定应用错误码可以提高测试准确性。

POST /shipment/cancel { orderID: 567, reason: ‘Wrong size’ }400 Response{ appError: 1023, message: ‘Order already shipped’, showUser: true }

如果你觉得 HTTP 响应应该是 500 而不是 400,那么这只是这篇文章的部分观点。关于怎么做是『对』的争论一直存在。

超媒体即应用状态引擎 (HATEOAS)

REST 和 RESTful 之间的一个核心区别在于 HATEOAS 的实现。一般是在你的 API 请求响应中发送相关 API 的 URL。如果你的 API 以一个银行的存款响应了,它也包含用来取钱的 URL。这种方式下 API 是可发现和可遍历的。在其他语言中 API 调用不返回方法指针指向相关的方法。所以又一次发问,为何我们将 API 搞得如此复杂?仅仅因为我们我们通过 HTTP 来执行它们还是为了适应别人的学说?

版本控制

另一个经常实现很多魔法的地方就是 API 版本控制方案。如果一个单一方法需要版本控制那么它可以简单的以 /user/getProfile2 形式实现,为何要用其他不直接的方法?如果控制器入口需要控制版本,可以简单的类似于 /user2/getProfile 。难道需要任何更复杂的东西吗?没有特殊的路由,没有魔法并且直接映射到你的后端控制器和方法。

NoREST!

一个 URL 应该清晰定义了位置,终点和参数。无需复杂的路由代码来分离参数。或是通过动词区分意图。

动词无关性,HTTP 动词真的只应该用来识别参数的去向 - 对 GET 来说它在 query string,对于 POST 它在 body。

版本控制应具体到被修改的事物。向下兼容易于维护,无需特殊的映射或属性。

HTTP 错误码,简化为 200/400。response body 包含应用特定错误码和消息。

具象状态传输,例如

GET /user/getProfile

可能返回一个 ProfileDTO (具象状态) 能被更新和作为一个参数通过下面的 API 回传至服务器

POST /user/setProfile

没有人在正确的 URL,动词或状态码上达成一致意见。REST 是一种风格,而不是一种标准。在远程 web 服务器上调用方法应该是一个简单的 RPC。 方法名称不和参数混合。方法不用动词修饰。参数都在一个单独的地方。简单。

转自:http://wtser.com/2015/03/08/who- ... vs-post-norest.html

本人能过最近也有这样的问题最后为了理解可实现上的简单最终还是在get上加参数了^_^

时间: 2024-11-08 02:09:23

谁会在意 GET vs POST? NoREST!的相关文章

莫在意

莫在意, 行路难. 莫在意, 人非难. 莫在意, 众叛离. 莫在意, 学无尽. 且歌吟, 勇攀高. 且歌吟, 立正身. 且歌吟, 心不改. 且歌吟, 时光在.

别太在意人走茶凉 物是人非

一杯茶,人走开了,自然慢慢地就凉了,冷了. 人的一生很长,会遇见很多人,会经历很多事,其中有酸有甜,有苦有辣.但无论经历过什么都不要迷失了自己的本心,抛弃自己的初衷和原则. 不管是朋友.同事.亲人,每天朝夕相处,自然交往频繁,关系密切.如若分开了,不会在每天见面了,联系逐渐的就慢慢变少了,关系也会逐渐变淡.时间一长很多人就不再联系了,并不是这个人对自己没用,更不是这个人不重要.而是大家早已没有共同语言,突然联系只会让彼此更加尴尬. 天下无不散的宴席,有相遇自然有相离,当缘分离去之时,不必太过执着

C语言之数组中你所不在意的重要知识

#include<stdio.h> void simpleArray(); void main() { simpleArray(); } //数组的简单操作 void simpleArray() { //数组的声明并赋值 int c[5] = { 1, 2, 3, 4, 5 }; printf("\nC数组内存中占%d个字节",sizeof(c));// /0在内存中会占一个字节,但是只针对于字符串 printf("\nC数组中有%d个元素",sizeo

你真在意可穿戴设备的续航吗?

自可穿戴设备发布之日起,伴随它的就是不断的质疑声.从外形.体验.性能到应用.价格,几乎都有可挑剔的地方.当然,质疑最多的还是其续航.我们知道,体积越大,越能容纳更大容量的电池--iPad Air就明显比iPad mini 2电量更大,续航时间更长.受限于可穿戴设备娇小的"身躯",即使苹果.索尼这样的工艺设计泰斗,也很难为其装入大容量电池,最终导致续航让用户不满意. 但是,你真的会在意可穿戴设备的续航吗?或者说,在实际体验过程中,你更在意续航,还是外形.性能.应用等其他方面?仔细想想,可

太在意别人的看法只会活得很累

人们总是很在意别人的想法,当别人说“你这样做不好”时,你会立马改过来,即使你的做法是正确的.其实,人们太在意他人的看法就会活得很累,因为总是因为别人的想法做出改变,总是担心自己做的不好. 我以前也是一个十分在意别人看法的人,当别人对我说:内向的人不好,没有前途.我就会认为:恩,是呀,我的性格就内向,怎么办呀.当一个女孩拒绝我的时候,我就会想:她拒绝我一定是我不好.就算是什么都不说,别人的一个眼神,一句不经意的话都会成为让我苛责的理由,所以当与人在一起的时候我会变得很紧张,因为我怕,怕自己表现的不

你不必太过在意!

原本我想给这篇博文命名叫做--"我们离死亡并不遥远",不过这样太过大煞风景并且也太悲观了!坐地铁回来的过程中看到我东的地铁广告语,感觉挺符合我想要的标题的!我在很早之前就明白世界并不完美,事事并不完美,人生并不完美的道理!我们也有许多无可奈何的时候,小时候觉得父母什么问题都能解决,现在慢慢的明白父母解决的问题其实非常的有限,我们本身也是一样,就是再有学问的人,再位高权重的人,再聪明绝顶的人也同样如此,只是每个人面对的问题的形式不一样了! 所以,我想说,我想给自己说,我想给所有人说! 亲

纯手写的原生js购物车 (不要在意布局)

<!DOCTYPE html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> *{margin: 0; padding: 0 } #table{ border-collapse:collapse; border:none; position: absolute; left:

人生必须做的十件事情 不要在意别人的评论

http://www.nanrenwo.net/zlht/23193.html 一年过去了,很多人都对新的一年有了规划,那么你的规划有没有受到一些人的影响呢?事实上,没有人有权评判你.人们可能听说过你的故事,但是他们对你所经历的事情没有切身感受:他们没有经历你的生活.因此忘记他们对你的议论.关注自己的感受,做自己认为正确的事情. 点击图片进入下一页 即使有人对你评头论足,也要做下面10件事情: 1. 照顾好自己.--自己和自己的关系是最亲近的并且是你所拥有的最重要的关系.如果你照顾不好自己,你也

别在意别人走多快,专注于自己走多远

外界的欢呼.嘈杂是属于他们的,你有自己既定的目标和要走的路. 调整呼吸,专注并享受你正在做的事. 这个世界有时像个漩涡,稍不留意就被卷入其中. 你看着大家都在做的事,听着大家都在说的话,不知不觉,你也成了别人口中的「大家」一员. 突然有一天有人问你,你的理想是什么? 你就像被远射灯照射的迷途小鹿,一脸茫然与惶恐. 你似乎什么都想做一点,又好像什么都做不了. 一时间,专注成了一件难事. 有人相伴固然很好,但别让太多嘈杂迷失了自己: 有时候你需要关上一些窗户,独留一扇自在呼吸. 专注你想做的事,心无