目前我正在尝试构建一个安静的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? “创造”和“删除”另一部分自然法则吗?
答案 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请求的内容拥有尽可能多的不同操作。您可以拥有createBook
,updateBook
,getAllBooks
等等。
你有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