只使用四个HTTP方法创建任何类型的restfulapi?

2024-06-01 20:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在尝试构建一个restfulhttp后端框架。在

我读过一本名为“restfulwebservices”的书,它在这方面引发了一些脑力劳动。在

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

难道不能说一切都是物体吗。汽车、笔、书,甚至抽象的东西,比如一个想法和一个概念,都可以是一个物体。因为object这个词只是人类对“某物”的发明。在

你不能说每一个“东西”都是一种资源。硬币、电脑甚至债务都可以成为一种资源。但问题是对谁。债务是一种资源,但不是欠的人,而是欠他的人。人体残留物也是一样。它们是资源,但不是给我们的,而是给大自然的,因为它需要科学基础(编程)的平衡。在

资源(对象)似乎是名词。形容词和动词怎么样?似乎一切都可以用名词来形容。例如

  • 形容词:汽车是红色的
  • 名词:这辆车是红色的
  • 形容词:我累了
  • 名词:我累了
  • 动词:我杀了他
  • 名词:我创造了一个杀戮
  • 动词:我吻她
  • 名词:我创造了一个吻

这意味着资源=对象=名词。从不同角度看同样的“东西”。在

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

回到这一切的开始。在

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

但后来我想,只有“进”和“出”。也许只有“创建”和“删除”。因为GET和PUT是动词,可以用“createadread”和“createachchange”来代替。在

所有这些只是我在玩弄大自然的基本原理。输入和输出,创建和删除。前者在编程领域已经被广泛接受。但后者你很少听说。但如果这是正确的,那么这意味着httprestfulapi可以用正确的方式来创建任何东西,而不是通过修改版本(将动词放在uri、请求主体中等)来攻击它,而只使用POST、GET、PUT和DELETE。在

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

result = Books.search("Foo");

我们必须思考:

^{pr2}$

你觉得怎么样? 考虑到这一点,是否可以只使用四个HTTP方法来创建任何类型的restfulapi? “创造”和“删除”是自然法则的另一部分吗?在


Tags: 对象http概念getput编程动词人类
3条回答

我认为您将restfulapi的两个不同方面联系起来。将HTTP方法简化为简单的IN和OUT已经通过请求和响应完成了。当然,可以将read映射为GET,将PUT映射为create,但是DELETE呢?那是“0”的结果吗?如果是这样,那么你需要逻辑来处理这个问题。在

例如,当您在文本编辑器中打开文档时,您正在操作系统中执行IN操作,而操作系统对文本编辑器执行and OUT操作。保存文档则相反。在

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

如果要简化为简单的输入和输出,则必须超载:

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

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

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

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

至于你的问题:是的,人们总是这样做,而且很管用!在

通过将GET=Read和POST=Write等效,可以只使用GET和POST两种方法创建任何系统。 其他方法只是帮助为请求添加一些可见性。在

如果您真的想尝试按照对象对REST请求进行建模,我会这样做:

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

然而,我不确定这个映射是否特别有价值。在

相关问题 更多 >