我正在尝试创建一个REST来与MySQL数据库交互。我想使用这个API从Android或iOS设备访问数据库,而不(显然)直接通过应用程序公开数据库。但是,我很难理解REST的一个关键方面,以及基于其原则设计的API的实现。
我从理论的角度理解休息的概念。我几天来一直在努力理解的是,如何将REST映射到数据库服务器上的某个位置。
如果我对具有给定URI的资源向服务器发出GET请求,例如http://www.example.com/resource,在内部,这在服务器上会转到哪里?我理解它的方式是,它进入根目录,然后转到"resource“目录。从那里,它返回“资源”目录中的所有文件。我很困惑,因为资源位于数据库服务器上,而不是调用API的服务器上。资源路径/层次结构是否表示服务器上的实际目录,还是资源的抽象?如果是后者,那么如何处理抽象的资源名,使其映射到数据库中的表或行?一直令人沮丧的是,无法找到具体的实现示例,在这些实例中,我可以很容易地理解这个URI路径是如何在内部工作的。
发布于 2012-06-13 21:18:39
你可以使用一个框架为你做很多工作,但是在这个框架下发生的事情并不是魔术。在某种程度上,URI映射到一些数据库表。它们并不是指特定的目录结构,而是试图解释资源之间的层次关系。
例如,假设我们在模拟一所大学。数据库中的元素存储在两个表中之一,要么是学院,要么是课程。学院表由描述法律系、医学院等的行组成。它有一个唯一的faculty_id列,然后是列来描述我们需要的任何东西。“课程”表有一个唯一的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=SELECT、POST=INSERT、PUT=UPDATE、DELETE=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框架列表,但我不认识其中的任何一个。不过还有其他一些,我最近还听说有人提到了阿普法,尽管我也不能告诉你太多。PHP可能是实现API的更常见的选择之一。然而,据我所知,cURL是一个只为连接其他网站而设计的库/工具。当然,您可以使用命令行版本来调试API,但我认为您在服务器端不会对它有太多的使用。
发布于 2012-06-13 19:02:52
我认为您应该从您想要构建REST应用程序的框架开始。Rails、RestEasy用于java、Codeigniter,都具有良好的REST路由功能。这包括从下划线资源中从数据库甚至业务流程中抽象URL。他们使用URL映射或为抽象创建外观来完成这一任务。
通常,REST与带有查询参数的tradational /PUT/POST并没有什么区别。实际上,Apache重写通常用于支持REST风格的路由。我建议您选择其中一个框架,并研究它们如何实现这些功能。Rails i在其他框架中有很大的优势。
https://stackoverflow.com/questions/11021408
复制相似问题