2013-03-18 113 views
2

我正在帮助为现有的数据库开发新的API。用于POST和PUT的RESTful API和外键处理

我使用Python 2.7.3,Django的1.5和Django的REST的架构在PostgreSQL 9.1 2.2.4

我需要/想的API好的文档,但是我缺兵少将,我恨编写/维护文档(我的许多缺陷之一)。

我需要允许API的消费者添加新的“POS”(销售点)位置。在Postgres数据库中,有一个从pos到pos_location_type的外键。所以,这是一个简化的表结构。

pos_location_type(
    id serial, 
    description text not null 
); 

pos(
    id serial, 
    pos_name text not null, 
    pos_location_type_id int not null references pos_location_type(id) 
); 

所以,让他们来发布新的POS机,他们将需要给我一个“pos_name”的一个有效pos_location_type。所以,我整个周末都在读这些东西。那里有很多争论。

我的API消费者如何知道pos_location_type是什么?或者在这里传递什么值?

看来我需要告诉他们在哪里得到pos_locations的有效列表。喜欢的东西:

GET /pos_location/ 

作为一个快速的注意,pos_location_type描述的例子可能是:( '学校', '公园', '办公')。

我真的很喜欢Django REST框架的“可浏览性”,但它似乎没有涉及这种类型的事情,而且我今天早些时候与汤姆克里斯蒂在IRC上聊了一个非常愉快的聊天记录,他在这里做什么并没有真正的答案(或者我从来没有明确提出过我的问题)。

我看过Swagger,这是一个非常酷的/有趣的项目,但看看他们的“宠物”资源在他们的demo here。注意它与我需要做的非常相似。要添加新的宠物,您需要传递一个类别,它们将其定义为类别类别(id:long,name:string)。消费者如何知道要通过什么?什么是有效的ID?或名字?

在Django rest框架中,我可以定义/覆盖在OPTION调用中返回的内容。我想我可以拿出自己的小“系统”在这里,回到像一些信息:

pos-location-url: '/pos_location/' 
在通用形式

,这将是:{}资源-url:“/路径/要/ resource_list”

这样的文件方面的工作,但我不知道这是否真的是一个很好的解决方案编程。如果我更改资源位置,该怎么办?这意味着我的消费者需要以编程方式使OPTION调用资源来找出所有关系。也许不是一件坏事,但感觉有点奇怪。

那么,人们如何处理这种事情呢?

最后说明:我得到的事实,我真的不希望在这里一个“泄漏” abstaction,并有我的数据库峰值直通API层,但事实仍然说是有这个一个foreign_key约束现有数据库而任何没有有效的pos_location_type_id的插入都会引发错误。

此外,我并不是试图打开URI与ID辩论。对于这个的讨论,用户是否必须使用pos_location_type_id int值或URI并不重要。无论哪种情况,他们都不知道要发送给我什么。

回答

0

我过去曾经使用过这种东西。我认为有两种方法可以解决这个问题,第一个是你已经说过的,允许API的用户知道端点pos_location_type的id-like值。许多API都这样做,因为从您的API开发人员将不得不阅读您的文档,并会知道从哪里获得值pos_location_type。最终用户不应该担心这一点,因为他们将有一个界面显示可能的文本值的下拉列表。

另一方面,我也是这样做的,而不是很REST风格。让我们假设你在纽约的位置,并使用POST可能是这样的:

POST /pos/new_york/ 

您可以处理/ POS /(LOCATION_NAME)/通过归一文,然后只需在数据库上搜索的值或一些相似之处,如果地方不存在,那么你只是创建一个新的。在情况下,用户可以添加新的地方,如果没有,那么用户必须知道什么固定的地方存在,这又是第一种情况,我们英寸

这样就可以避免在请求数据pos_location_type,你可以以编程方式将其映射到有效的ID。

+0

感谢您的回复。我不确定我了解你的建议。 API消费者如何知道他们需要发布到/ pos/new_york/vs/pos/new-york/vs./pos/ny/vs/pos/nyc/ – 2013-03-18 18:37:10

+0

你是对的,我编辑了我的答案,但如果地点是固定的,那么我认为向用户展示可能性是唯一的选择。 – PepperoniPizza 2013-03-18 19:31:27

+0

感谢您的回复和编辑。顺便说一句,为了清晰起见,我编辑了我的问题。它不像location_type(比如:学校,公园,零售店,办公室)那么位置(如城市)。 – 2013-03-18 20:22:12