仅使用四种HTTP方法创建任何类型的restful API?

时间:2010-11-06 03:30:45

标签: java javascript python ruby rest

目前我正在尝试构建一个安静的HTTP后端框架。

我读过一本名为“Restful webservices”的书,它在这个领域开始了一些脑力劳动。

我现在对于为什么面向资源的架构是一件好事有了更大的了解,但仍然有一些我无法理解的模糊部分。我会试着解释一下我的想法,看看是否有人能让我更聪明。

无法说一切都是对象。汽车,钢笔,书籍甚至抽象的东西,如想法和概念都可以成为一个对象。因为单词对象只是人类对“某事”的发明。

难道你也不能说每个“东西”都是一种资源。硬币,计算机甚至债务可能是一种资源。但问题是对谁。债务是一种资源,但不是欠欠债的人,而是欠他欠债的人。与人体残留物相同。它们是资源,但不是为了我们,而是为了大自然,因为它需要平衡 - 进出 - 科学(编程)的基础。

资源(对象)似乎是名词。形容词和动词怎么样?实际上似乎所有东西都可以用名词来描述。例如

  • 形容词:车是红色的
  • 名词:汽车颜色为红色
  • 形容词:我累了
  • 名词:我有一种疲惫
  • 动词:我杀了他
  • 名词:我创造了一个杀人
  • 动词:我亲吻她
  • 名词:我创造了一个吻

这意味着resource = object = noun。从不同角度看同样的“事物”。

也许有动词和形容词没有名词等同,但那只是人类语言中的一个缺陷,而不是概念本身。

回到开始这一切的原因。

当我真的想到只有4个(我知道还有更多)HTTP动词 - POST,GET,PUT,DELETE - 我觉得它无法创建强大的restful API,因为它们将API限制为基本CRUD操作。但经过一些阅读和思考后,我意识到一切都只是可以创建,读取,更改或删除的资源。喜欢进出,简单的规则,但创造任何东西都很强大。

但后来我想,只有“在”和“在外”。也许只有“创造”和“删除”。原因GET和PUT是可以用“创建读取”和“创建更改”替换的动词。

这一切只是我在玩大自然的基本知识。进出,创建和删除。前者已经在编程领域被广泛接受。但后者你没有听到那么多。但如果这是正确的,那么这意味着HTTP Restful API可以用于以正确的方式创建任何东西,而不是通过修改版本(将动词放在uri中,请求正文等),但仅使用POST, GET,PUT,DELETE。

我们只需要将所有方法转换为资源/对象。而不是:

result = Books.search("Foo");

我们必须考虑:

result = Search.create(Books, "Foo");

您如何看待这个? 考虑到这一点,是否可以使用四种HTTP方法创建任何类型的restful API? “创造”和“删除”另一部分自然法则吗?

5 个答案:

答案 0 :(得分:1)

您可以使用两种方法创建任何系统,GET和POST,等同于GET = Read和POST = Write。 其他方法只是有助于为请求添加一些可见性。

如果您真的想尝试根据对象建模REST请求,我会这样做:

result = new Search(Books,"Foo").Get();

但是,我不确定这种映射是否特别有价值。

答案 1 :(得分:1)

RESTful API本质上是某种数据存储的接口:DB,文件系统,分布式哈希表,& c。这意味着你真的不需要自定义动词(标准接口通常更好),因为你可以使用GET,PUT,POST和DELETE完成所有操作。

同样重要的是要注意RESTful API 专门要求将现有HTTP方法用于CRUD资源。此外,API不需要复杂或冗长有用甚至功能强大。在大多数情况下,简单是你的朋友。在许多情况下,简单的结构和简单的接口比同等的复杂结构/接口做得好得多。例如,看看git,它使用的数据结构非常非常简单,因此git非常非常快。

关于你的问题:是的,人们一直这样做而且有效!

答案 2 :(得分:1)

  

但后来我想,只有“在”   和“出去”。也许只有   “创建”和“删除”。导致GET和   PUT是可以替换的动词   用“创造一个阅读”和“创造一个   变”。

你可以这样做。您可以更进一步,并使用POST执行所有操作。然后,您可以在HTTP请求中包含一个信封,该信封说明您要执行的操作。您甚至可以只有一个端点,并根据HTTP请求的内容拥有尽可能多的不同操作。您可以拥有createBookupdateBookgetAllBooks等等。

你有SOAP

作为必须为SOAP和RESTful Web服务构建,维护和编码的人,请自己(以及其他所有人)帮忙,并使用REST。

答案 3 :(得分:1)

我认为您正在讨论restful API的两个不同方面。将HTTP方法简化为简单的IN和OUT已经通过请求和响应完成。当然,你可以将read映射到GET和PUT来创建,但DELETE呢?那是“PUT为0”吗?如果是这样,那么你需要逻辑来处理这种情况。

例如,当您将文档打开到文本编辑器中时,您正在对OS执行IN操作,并且OS对文本编辑器执行和OUT操作。保存文档的情况恰恰相反。

但这只是简单的家务保持机制。当然,文本编辑器可以使用PUT屏蔽IN,使用PUT屏蔽OUT,如“另存为”,但是DELETE呢?这将需要它自己的动词或将PUT / OUT动作重载到OS。然后是POST,相当于save *。我们是否重载PUT方法以检查文件是否已存在?为什么不把它作为自己的动词?

如果你要减少到简单的IN和OUT,那么你必须重载OUT:

if(OUT){
    if(file_exists) update_file
    else if(file_size==0) delete_file
    else create_file
}

*我说的理论上更多,当然zzzzBov在他的关于HTTP规范的帖子中是正确的。

答案 4 :(得分:0)

GET,POST,PUT和DELETE与创建,读取,更新和删除没有直接关系。它们通常可以,但重要的是要注意POST和PUT都可以执行更新和创建功能。

http://en.wikipedia.org/wiki/POST_%28HTTP%29

  

POST方法应该用于任何   请求所在的上下文   非幂等

这意味着POST应该用于任何改变服务器(数据)状态的函数,并且GET,PUT和DELETE应该用于任何不改变服务器状态的函数。

编辑:
回答这个问题:是的。我已经看到了许多用于创建带有html标头的restful API的解决方案。它们都归结为使用目录结构和正确的HTML标题。

http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services