我正在帮助为现有数据库开发新的 API。
我正在使用 Python 2.7.3、Django 1.5 和 django-rest-framework 2.2.4 和 PostgreSQL 9.1
我需要/想要好的 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 描述的示例可能是:('school', 'park', 'office')。
我真的很喜欢 Django REST 框架的“可浏览性”,但是,它似乎并没有解决这类问题,实际上我今天早些时候在 IRC 上与 Tom Christie 进行了非常愉快的交谈,他并没有真的有一个关于在这里做什么的答案(或者也许我从来没有明确我的问题)。
我看过 Swagger,这是一个非常酷/有趣的项目,但请在此处的演示中查看他们的“宠物”资源。请注意,这与我需要做的非常相似。要添加新宠物,您需要传递一个类别,他们将其定义为类 Category(id: long, name: string)。消费者如何知道要在这里传递什么?什么是有效身份证?或名字?
在 Django rest 框架中,我可以定义/覆盖 OPTION 调用中返回的内容。我想我可以在这里提出我自己的小“系统”并返回一些信息,例如:
pos-location-url: '/pos_location/'
在通用形式中,它将是: {resource}-url: '/path/to/resource_list'
这对文档方面来说有点用,但我不确定这是否真的是一个很好的编程解决方案。如果我更改资源位置怎么办。这意味着我的消费者需要以编程方式制作和 OPTIONS 调用资源来找出所有关系。也许不是坏事,但感觉有点奇怪。
那么,人们如何处理这种事情呢?
最后的说明:我知道我真的不想要一个“泄漏”的抽象,并让我的数据库通过 API 层达到峰值,但事实仍然是这个现有数据库和任何插入都有一个 foreign_key 约束。 t 有一个有效的 pos_location_type_id 会引发错误。
另外,我并不是要展开 URI 与 ID 的辩论。对于本次讨论,用户是否必须使用 pos_location_type_id int 值或 URI 无关紧要。无论哪种情况,他们都不知道该给我寄什么。