煤矿中的金丝雀。
我已经等了差不多一年了。不可避免的是这一天将会到来,我相信在接下来的几个月中我们还会看到更多类似的问题。
警告标志
您是完全正确的,构建RESTful客户端要比SOAP客户端花费更多的时间。SOAP工具箱删除了许多样板代码,几乎不用费劲就可以使客户端代理对象可用。使用Visual Studio之类的工具和服务器URL,我可以在五分钟内在本地访问任意复杂程度的远程对象。
返回application / xml和application / json的服务对于客户端开发人员而言非常烦人。我们应该如何处理这些数据?
幸运的是,许多提供REST服务的站点还提供了一堆客户端库,因此我们可以使用这些库来访问一堆强类型对象。虽然似乎有点愚蠢。如果他们使用SOAP,我们可以自己对这些代理类进行代码生成。
SOAP开销,哈。延迟是致命的。如果人们真的担心通过网络传输的多余字节数,那么HTTP可能不是正确的选择。您是否看到用户代理标头使用了多少字节?
是的,您是否尝试过将Web浏览器用作除HTML和JavaScript之外的任何其他工具的调试工具。相信我,这很烂。您只能使用其中两个动词,缓存一直在妨碍您,错误处理吞噬了太多信息,它一直在寻找一个该死的favicon.ico。射死我
可读的URL。只有名词,没有动词。是的,这很容易,只要我们仅执行CRUD操作,并且只需要以一种方式访问对象的层次结构即可。不幸的是,大多数应用程序需要比这更多的功能。
即将来临的灾难
当前有大量开发人员在开发与REST服务集成的应用程序,他们正在得出与您相同的结论。它们被承诺具有简单性,灵活性,可伸缩性,可演化性以及偶然性重用的圣杯。网络本身的特征,怎么会出错。
但是,他们发现版本控制同样是一个问题,但是编译器无法帮助发现问题。随着数据结构的发展和URL的重构,手写的客户端代码很难维护。仅围绕名词和四个动词来设计API确实非常困难,尤其是在RESTful Url狂热者告诉您何时可以使用查询字符串和不使用查询字符串的情况下。
开发人员将开始问为什么我们在支持Json格式和Xml格式上浪费了我们的精力,为什么不仅仅将精力集中在一种格式上呢?
事情怎么错了
我会告诉你哪里出了问题。作为开发人员,我们让市场部门利用了我们的主要弱点。我们对银弹的永恒追求使我们对REST真正的现实视而不见。从表面上看,REST如此简单。用Urls命名资源,并使用GET,PUT,POST和DELETE。糟糕,我们的开发人员已经知道该怎么做,多年来我们一直在处理具有表和列以及具有SELECT,INSERT,UPDATE和DELETE的SQL语句的数据库。它本来应该是小菜一碟。
有人讨论过REST的其他部分,例如自我描述性和超媒体约束,但是这些约束并不像资源标识和统一接口那样简单。在期望的目标是简单性的情况下,似乎增加了复杂性。
这种淡化的REST版本在许多方面已在开发人员文化中得到验证。创建了鼓励资源标识和统一接口的服务器框架,但没有采取任何措施来支持其他约束。术语开始围绕差异化方法而浮动(HI-REST与LO-REST,企业REST与学术REST,REST与RESTful)。
一些人大声疾呼,如果您不应用所有约束,那不是REST。您将无法获得好处。没有一半的REST。但是这些声音被贴上了宗教狂热分子的标签,他们对自己宝贵的用语从默默无闻中被窃取并成为主流感到不安。嫉妒的人试图使REST听起来比现在困难得多。
术语REST绝对已经成为主流。几乎所有具有API的主要网络媒体资源都支持“ REST”。Twitter和Netflix是两个非常引人注目的公司。可怕的是,我只能想到一个可以自我描述的公共API,并且有少数真正实现了超媒体约束。确保诸如StackOverflow和Gowalla之类的某些站点在其响应中支持链接,但是它们的链接中存在巨大的漏洞。StackOverflow API没有根页。想象一下,如果该网站没有主页,该网站将多么成功!
怕你被误导了
如果到目前为止,您的问题的简短答案是那些API(Netflix和Twitter)不符合所有约束,因此您将无法获得REST API应该带来的好处。
REST客户端的确比SOAP客户端花费更长的时间,但是它们并不局限于一种特定的服务,因此您应该能够跨服务重用它们。以网络浏览器为例。Web浏览器可以访问多少服务?资讯提供阅读器呢?现在,普通的Twitter客户端可以访问多少种不同的服务?是的,只有一个。
不应将REST客户端构建为与单个服务接口,而应构建为处理任何服务可以服务的特定媒体类型。显而易见的问题是,如何为交付application / json或application / xml的服务构建REST客户端。好吧,你不能。那是因为这些格式对REST客户端完全没有用。你自己说的
您必须“猜测”管道中将返回的内容,因为没有真正的架构或参考文档
您绝对正确使用Twitter之类的服务。但是,REST中的自描述约束表明HTTP内容类型标头应准确描述通过网络传输的内容。交付application / json和application / xml不会告诉您有关内容的任何信息。
在考虑基于REST的系统的性能时,有必要从更大的角度考虑。谈论信封字节就像谈论快速排序与外壳排序时的循环展开一样。在某些情况下,SOAP可以执行得更好,在某些情况下,REST可以执行得更好。上下文就是一切。
REST通过非常灵活地支持它所支持的媒体类型以及对缓存的复杂支持而获得了很多性能优势。为了使缓存正常工作,尽管必须遵守几乎所有限制。
到目前为止,关于可读URL的最后一点是最具有讽刺意味的。如果您真正致力于超媒体约束,那么每个URL都可以是GUID,并且客户端开发人员将不会损失任何可读性。
在开发REST系统时,URI对客户端应该是不透明的这一事实是最关键的事情之一。可读的URL对服务器开发人员来说很方便,而结构良好的URL使服务器框架更容易调度请求,但是这些是实现细节,对使用API的开发人员没有影响。
Twitter API甚至还不是接近REST风格的,这就是为什么您看不到通过SOAP使用它的任何好处的原因。Netflix API更加接近,但它对通用媒体类型的使用表明,即使仅遵循一个约束条件,也可能对服务所产生的收益产生深远影响。
可能不是他们的错
我已经在服务提供者上进行了大量转储,但是需要两个来完成REST跳舞。服务可能会严格遵循所有约束条件,客户仍然可以轻松撤消所有收益。
如果客户端使用硬编码的URL来访问某些类型的资源,那么它将阻止服务器更改这些URL。任何基于对服务如何构造其URL的隐式知识的URL构造都是违反的。
假设将从链接返回哪种表示形式会导致问题。基于未在HTTP标头中明确说明的知识对表示的内容进行假设,肯定会造成耦合,这将在将来引起麻烦。
他们应该使用SOAP吗?
就我个人而言,我不这么认为。正确完成REST可以使分布式系统长期发展。如果您要构建具有由不同人员开发的组件并且需要持续多年的组件的分布式系统,那么REST是一个不错的选择。