2

我正在尝试创建一个 REST API 来与 MySQL 数据库交互。我想使用此 API 从 Android 或 iOS 设备访问数据库,而无需(显然)直接通过应用程序公开数据库。但是我在思考关于 REST 的一个关键方面以及根据其原则设计的 API 的实现时遇到了问题。

我从理论的角度理解 REST 的概念。几天来我一直在努力理解的是REST URI 如何映射到位于数据库服务器上的东西。

如果我向服务器发出 GET 请求以获取具有给定 URI 的资源,例如http://www.example.com/resource,在内部,这在服务器上的什么地方?我理解它的方式是它进入根目录,然后进入“资源”目录。从那里它返回该“资源”目录中的所有文件。我只是感到困惑,因为资源位于数据库服务器上,而不是从中调用 API 的服务器上。资源路径/层次结构是代表服务器上的实际目录还是资源的抽象?如果是后者,那么我该如何处理该抽象资源名称以使其映射到数据库中的表或行?无法找到具体的实现示例令人沮丧,我可以很容易地理解这个 URI 路径在内部是如何工作的。

4

2 回答 2

0

您可以使用框架为您完成很多工作,但在后台发生的事情并不神奇。在某种程度上,URI 映射到一些数据库表。它们不是指某个目录结构,而是试图解释资源之间的层次关系。

例如,假设我们正在为一所大学建模。数据库中的元素存储在FacultiesCourses两个表之一中。Faculties 表由描述法学院、医学院等的行组成。它有一个独特的Faculty_id列,然后是用于描述我们需要的任何内容的列。Courses 表有一个唯一的course_id列和一个外键Faculty_id列,以告知该课程属于哪个学院。

设计此 API 的 RESTful 方式可能是

  • /faculties获取所有院系的列表,检索SELECT * FROM Faculties
  • /faculties/2获取有关某个学院的信息,使用检索SELECT * FROM Faculties WHERE faculty_id=2
  • /faculties/2/courses获取属于某个学院的所有课程,检索SELECT * FROM Courses WHERE faculty_id=2
  • /faculties/2/courses/15检索某个课程,如果它确实属于教师 2,则检索SELECT * FROM Courses WHERE faculty_id=2 AND course_id=15

其具体实现取决于您选择的编程语言(可能还有框架),但在某些时候,您需要选择应该如何查询数据库。这并不明显。你需要仔细计划它才有意义!

来自数据库的结果当然必须以某种方式编码,通常是 XML 或 JSON(但其他表示形式也一样好,尽管可能不那么常见)。

除此之外,您还应该确保正确实现这四个动词,以便它们匹配 SQL 命令(GET= SELECTPOST= INSERTPUT= UPDATEDELETE= DELETE),正确处理编码协商,返回正确的 HTTP 响应代码以及所有其他预期的东西一个 RESTful API。

作为最后一条建议:如果你能巧妙地做到这一点,那么你设计移动应用程序就会变得容易得多。我真的不能强调这一点。例如,如果您在POST请求中返回现在在数据库中查看的完整条目,您可以立即使用正确的 ID 将其存储在手机上,并且您可以使用相同的代码来呈现内容,如果它有已使用GET请求下载。此外,在您知道该请求是否成功之前,您不会通过过早更新来欺骗用户(手机失去连接很多)。

编辑:在评论中回答您的问题:创建 API 可以被视为一种艺术形式,并且可能不应该在设计阶段涉及任何编码。API 应该是有意义的并且不依赖于特定的实现(即不同的数据库选择不应该影响您的 API)。您的下一个任务将是在 API 的人类可读结构和您的数据库之间建立联系(不管它是关系的还是其他的)。所以是的,你需要做一些翻译,但我看不出查询字符串对你有什么帮助。典型的结构是api.my.website/collection/element/collection/element。查询可用于过滤。例如,您可以编写example.com/resource?since=2012-06-01以从“资源”集合中检索元素的子集,用唯一的 ID 表达。

根据我的理解,您认为传入的请求必须始终根据 PHP 和 HTTP 服务器的工作方式转到单独的文件。事实并非如此。您可以配置您的 Web 服务器以将每个请求路由到单个 PHP 文件,然后解析$_SERVER['REQUEST_URI']. 根据您选择的 HTTP 服务器,您的里程可能会有所不同,但这基本上是您想要做的。

通过谷歌搜索,我找到了 PHP 框架列表,但我不知道其中任何一个。不过,还有其他人,我最近也听到有人提到Apify,尽管我也不能告诉你太多。PHP 可能是实现 API 的更常见的选择之一。然而,据我所知,cURL是一个仅用于连接其他网站的库/工具。您当然可以使用它的命令行版本来调试您的 API,但我认为您在服务器端不会有太多用处。

于 2012-06-13T21:18:39.287 回答
0

我认为您应该从要构建 REST 应用程序的框架开始。Rails、RestEasy for java、Codeigniter,都具备良好的 REST 路由能力的基础。这包括从数据库甚至业务流程的下划线资源中提取 URL。他们使用 URL 映射或为抽象创建外观来完成此操作。
通常 REST 与带有查询参数的传统 GET/PUT/POST 并没有真正的区别。事实上,Apache URL 重写通常用于支持 REST 风格的路由。我建议您应该选择其中一个框架并研究它们如何实现此功能。Rails i 的东西在其他框架中具有显着的优势。

于 2012-06-13T19:02:52.373 回答