REST URI如何在内部工作?

时间:2012-06-13 18:48:23

标签: android ios api rest

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

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

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

2 个答案:

答案 0 :(得分:0)

我认为你应该从你想要构建REST应用程序的框架开始。 Rails,RestEasy for java,Codeigniter,都具有良好的REST路由功能。 这包括从数据库甚至业务流程中的下划线资源中抽象URL。他们使用URL映射或为抽象创建Facade来实现此目的 通常,REST与带有查询参数的传统GET / PUT / POST没有什么不同。事实上,Apache URL重写通常用于支持REST样式路由。我建议您选择其中一个框架并研究它们如何实现这些功能。 Rails我的东西在其他框架中具有显着的优势。

答案 1 :(得分:0)

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

例如,假设我们正在为一所大学建模。数据库中的元素存储在两个表中的一个表中, Faculties Courses 。 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服务器的工作方式分离文件。这是的情况。您可以configure your web server to route every request to a single PHP file然后解析$_SERVER['REQUEST_URI']。根据您选择的HTTP服务器,您的里程可能会有所不同,但这基本上就是您想要做的。

通过Google搜索我发现a list of frameworks for PHP但我不知道其中任何一个。还有其他人,我最近也听到有人提到Apify,虽然我也不能告诉你很多。 PHP可能是实现API的更常见选择之一。但是,据我所知,cURL是一个仅用于连接其他网站的库/工具。您当然可以使用the command line version of it来调试您的API,但我认为您在服务器端没有太多用处。