REST - 复杂的应用REST - 复杂的应用(REST - complex applicat

2019-05-12 15:28发布

我挣扎的RESTful原则适用于我工作的一个新的Web应用程序。 特别是,它是为REST风格,每个HTTP请求应自行为其收件人处理它是完全和谐HTTP的无状态特性携带足够的信息的想法。

该应用程序允许用户搜索的药物。 搜索过滤器接受的输入,例如,回报停产的药品,包括免费治疗etc..etc。 总共有大约30的过滤器,可被应用。

此外,病人的详细信息可输入,包括患者的年龄,性别,目前的药物等。

要平安,要所有这些信息将包含在每一个要求吗? 这似乎是把网络上的巨大开销。 此外,不会对URL长度的限制,至少对于GET,使这不可行?

Answer 1:

在“过滤器资源”是这一个完美的间歇。

您可以将过滤器定义付诸过滤器资源,它可以返回过滤器的ID。

PUT是幂等,所以即使在过滤器已经存在,你只需要检测到您以前见过的过滤器,这样你就可以返回正确的ID进行过滤。

然后,您可以过滤参数添加到您的其他要求,他们可以抓住要使用的查询过滤器。

GET /药物?过滤= 1234&页= 4&页大小= 20

我会通过某种标准化进程的运行原料过滤器,只需要有一个标准化的设置,使得例如过滤器“名字=鲍勃姓氏=班克斯”等同于“姓氏=班克斯名字=鲍勃”。 这就是我虽然。

唯一真正值得关注的是,随着时间的推移,你可能需要一些陈旧的过滤器。 你可以简单地从错误的请求应该有人做一个缺失或过时的过滤器的请求。

编辑回答问题...

让我们先从基本面。

简单地说,你要指定在查询中使用的过滤器,但这些过滤器(潜在的)参与和复杂。 如果是简单/药物/ 1234,这不会是一个问题。

实际上,你总是需要过滤器发送到查询。 现在的问题是如何表示该过滤器。

事情就像在REST系统会话的基本问题是,他们通常管理“带外”。 当你,说,去创造一种药物,你把或POST的药物资源,你会得到一个参考回到服药。

与会话,你会(典型值)取回的cookie,或者一些其他的标记来表示该会话。 如果你投入到药物资源创建一个会话也,那么,说实话,你的要求创建了两个资源:药物和会话。

不幸的是,当你使用像一个cookie,你需要的cookie您的要求,资源名称不再是资源的真实再现。 现在,它的资源名称(URL),以及Cookie。

所以,如果我做一个名为/药物/搜索该资源的GET和Cookie都代表一个会话,该会话碰巧有一个过滤器,你可以看到如何有效,该资​​源的名称/药物/搜索,是不是真的有用的。 我不知道所有的我需要有效地利用信息,因为该cookie和会话,并在其中的过滤器的副作用。

现在,你也许可以重写名称:?/药物/搜索会话= ABC123,有效地嵌入在资源名称的Cookie。

但现在你在运行会话的典型合同,尤其是他们短暂的。 于是,那个叫资源是用处不大,长期来看,不是没用,只是不太有用。 眼下,这个查询给了我感兴趣的数据。 明天? 可能不是。 我会得到有关会议上,一些讨厌的错误之中去了。

另一个问题是,会议通常不会作为资源管理。 例如,他们通常是一个副作用,通过VS GET / PUT / DELETE显式管理。 会议还对“垃圾堆”的Web应用程序的状态。 在这种情况下,我们只是一种希望,本次会议是正确填入什么是需要这一请求。 实际上,我们真的不知道。 再次,这是一个副作用。

现在,让我们把它发挥得淋漓尽致一点点。 让我们用/药物/搜索?过滤器= ABC123。

显然,随随便便,这看起来是相同的。 我们刚刚从“会议”到“过滤器”更名。 但是,正如所讨论的,过滤器,在这种情况下,是一个“一流的资源”。 他们需要创建,管理等一样的药物,一个JPEG或系统中的任何其他资源。 这是关键的区别。

当然,你可以把“会议”作为一个一流的资源,创建它们,直接把东西在其中,等等,但你可以看到,在从一个清晰点至少,“第一类”会议是不是真的良好的抽象这种情况。 使用一个会话,它就像在你的整个钱包或公文包去清洁工和移交。 “是啊,门票是在某个地方,挖掘出你想要的东西,给我的衣服”,尤其是相对于显性的东西就像一个过滤器。

所以,你可以看到,在30000英尺有没有在过滤器和会话之间的情况有很大的区别的。 但是,当你放大,它们是完全不同的。

与过滤器资源,您可以选择让他们持久的事情,直到永远。 您可以终止它们,你可以做任何你想要的。 会议往往有先入为主的语义:短住,连接的持续时间等的过滤器可以有你想要的任何语义。 他们是从什么来与会话完全独立的。

如果我这样做,我将如何使用过滤器的工作?

我会认为我真的不关心过滤器的内容。 具体而言,我怀疑我会永远查询“到名字搜索所有过滤器”。 在此关头,好像不感兴趣的信息,所以我不会在其周围设计。

接下来,我会正常化过滤器,就像我上面提到的。 确保相当于过滤器真正是等价的。 您可以通过排序表达式做到这一点,确保字段名都是大写的,或什么的。

然后,我将存储过滤器作为XML或JSON文件,取其更舒适/适合于应用。 我想给每个过滤器唯一的密钥(自然),但我也将存储的哈希与过滤器的实际文件。

我会做这是能够迅速找到如果过滤器已保存。 由于我正火,我“知道”的XML(比如说)为逻辑上是等价的过滤器将是相同的。 所以,当有人去放,或插入一个新的过滤器,我会做散列检查,看它是否之前已经存储。 我可能回去不止一个(散列碰撞可以,当然),所以我需要检查实际的XML有效载荷,看它们是否匹配。

如果过滤器匹配,我回到现有的过滤器的参考。 如果没有,我会创建一个新的和返回。

我也不会允许过滤UPDATE / POST。 由于我端出引用这些过滤器,我会让他们一成不变的,因此引用保持有效。 如果我想通过“角色”过滤器,说,“获取所有到期的药物筛选”,然后我会创建一个“命名的过滤器”的资源,将名称与过滤器实例相关联,因此,实际的过滤数据可以改变,但名称保持不变。

心灵,也即创建过程中,你的竞争条件是(两个请求试图让相同的过滤器),那么你就必须考虑到这一点。 如果您的系统具有很高的过滤器体,这可能是一个潜在的瓶颈。

希望这澄清了问题你。



Answer 2:

要平安,要所有这些信息将包含在每一个要求吗?

不,如果它看起来像你的服务器发送(或接收)的信息太多,有机会,有您还没有确定一个或多个资源。

在设计RESTful系统中第一个也是最重要的一步是确定和命名您的资源。 你会怎么做,对你的系统?

从你的描述,这里是一组可能的资源:

  • 用户 -该系统的用户(?可能是医生或病人() - 角色可能需要在这里暴露作为一种资源)
  • 药物 -在瓶子里的东西,但它也可能代表的那种瓶(数量和内容),或者它可能是一个特别的瓶子-这取决于如果你是一个药房或只是一个帮助桌子上。
  • 疾病 -对于其中一个病人可能需要服用药物的情况。
  • 患者 -谁可能服用药物的人
  • 建议 -这可能是基于他们遭受疾病患者有益的药品

然后,你可以寻找资源之间的关系;

  • 用户属于多个角色
  • 药物有属于许多疾病
  • 疾病有很多的建议
  • 病人已属于许多药物疾病 (可怜的人)
  • 病人有许多建议
  • 建议有一个病人 ,有一种疾病

细节可能是不适合你的特殊问题,但这个想法很简单:创建资源之间的关系网络。

在这一点上它可能是考虑URI结构有帮助的,不过请记住, REST API的必须是超文本驱动的 :

# view all Recommendations for the patient
GET http://server.com/patients/{patient}/recommendations

# view all Recommendations for a Medication
GET http://servier.com/medications/{medication}/recommendations

# add a new Recommendation for a Patient
PUT http://server.com/patients/{patient}/recommendations

因为这是休息,你会花大部分的时间定义媒体类型用于客户端和服务器之间传输的资源的表示。

通过暴露更多的资源,你可以在需要每个请求期间要传输的数据量减少。 还要注意有在没有的URI查询参数。 因为它需要保持它的所有曲目,服务器可以为有状态的,并且每个请求可以是完全独立的。



Answer 3:

REST是的API,而不是(典型值)的应用程序。 不要试图楔从根本上有状态的交互成只是因为你在维基百科上阅读了无状态的模型。

要平安,要所有这些信息将包含在每一个要求吗? 这似乎是把网络上的巨大开销。 此外,不会对URL长度的限制,至少对于GET,使这不可行?

相比服务器发送资源的大小的参数的大小通常是不重要的。 如果您在使用如此大的参数,他们是一个网络的负担,将它们放置在服务器上的一次 ,然后将它们用作资源。

有对URL长度没有限制显著 - 如果你的服务器有这样的限制,升级。 这可能岁,塞满安全漏洞的反正。



Answer 4:

没有这一切不必在每个请求。

每个资源(药物治疗,患者病史等)应该有一个规范的URI唯一标识它。 在某些应用(例如,基于Rails的),这将是类似“/例/ 1234”或“/药物/ 5678”,但URL格式是不重要的。

先前已经得到的URI对资源(例如,从搜索,或从嵌入在另一资源的链接)客户端可以使用该URI检索它。



Answer 5:

你对一个RESTful API的工作,其他的应用程序将使用搜索数据? 或者,您构建一个最终用户集中的Web应用程序,用户将登录并执行这些搜索?

如果您的用户登录,那么你已经有状态,你将有一些类型的会话cookie来保持登录状态。 我会继续前进,创建一个包含所有搜索过滤器会话对象。 如果用户没有设置任何过滤器,那么这个对象将是空的。

下面是关于使用GET VS POST一个伟大的博客文章。 它提到一个网址长度上限由2,048个字符的Internet Explorer设置,所以要使用POST长期的请求。

http://carsonified.com/blog/dev/the-definitive-guide-to-get-vs-post/



文章来源: REST - complex applications
标签: session rest