在PHP中设计基本的Restful API

在PHP中设计基本的Restful API,php,rest,restful-architecture,Php,Rest,Restful Architecture,这是一项家庭作业。它涉及到创建一个简单的数据库并对服务器进行CURL调用以从数据库中获取结果,因此我有一个包含所需方法的DBClass文件。我知道REST架构一般是什么,但我有点无法将这些部分组合起来。以下是我目前掌握的情况: Model.class.php->这是一个数据库类,它实例化与数据库的连接,并具有执行数据库查询和返回结果的方法 Simulator.php->helper类,模拟对本地主机的HTTP请求(POST或GET only),以便对http://localhost/app/in

这是一项家庭作业。它涉及到创建一个简单的数据库并对服务器进行CURL调用以从数据库中获取结果,因此我有一个包含所需方法的DBClass文件。我知道REST架构一般是什么,但我有点无法将这些部分组合起来。以下是我目前掌握的情况:

  • Model.class.php
    ->这是一个数据库类,它实例化与数据库的连接,并具有执行数据库查询和返回结果的方法
  • Simulator.php
    ->helper类,模拟对本地主机的HTTP请求(POST或GET only),以便对http://localhost/app/index.php"
  • index.php
    ->这里是我接收CURL请求的地方,实际上,我对HTTP请求进行解码以了解请求方法、参数、URI等
  • 在这一点上,我迷路了。可以理解,RESTful API请求本质上属于server/getMeMyBananas类型,getMeMyBananas是一种为用户查找香蕉并返回ID的DB方法。我不明白这是如何映射到index.php文件和缺少的部分的


    欢迎您提出建议并链接到精彩资源。我对安全性或创建最先进的Web服务不感兴趣。

    getMeMyBananas是RPC路由的一个示例

    在REST中,四个主要HTTP动词GET、POST、PUT和DELETE是作用于名词(资源)的动词

    休息不是标准。这是一个松散的建议,如何形成一个API的远程系统使用HTTP为基础。 毫无疑问,您不能在RESTAPI中设计类似RPC的路由。人们总是这样做。只是您主要使用这些动词来创建(POST)、检索(GET)、更新(PUT)或删除(delete)。这使得首字母缩略词CRUD。因此,使用REST,只需坚持使用CRUD,就可以覆盖信息交换中的许多场景

    因此,您可以从设计类似于名词(资源)的URL(路由)开始,并在PHP中构建一个切换案例来切换HTTP谓词。请记住,没有什么可以阻止的,使用类似RPC的路由也没有什么错。事实上,您不能使用简单的REST CRUD场景处理所有情况,因此您必须使用类似RPC的路由来处理不适合该场景的情况

    见:

    稍后,如果您对PHP中的内置API感兴趣,我将构建一个API基础设施并将其开源。我不确定它是否对你有帮助,但它在这里:


    您可以将任何url映射到您想要的任何路径
    例如,当使用Apache时,您可以使用http://ex.com/rest/bananas进入
    http://ex.com/index.php?p1=rest&p2=bananas


    现在,您可以使用全局变量get获取请求参数,例如:
    $\u get[“p1”]
    。 我建议您对这些进行测试。

    之后,当您获得数据时,我建议将其打包为JSON,以便几乎所有客户机都可以读取它


    基本上我就是这么做的!如果你有更多的问题,请继续:)

    你可以像wordpress那样用mod_rewrite模拟其余的问题。因此index.php?m=getmebanana变成了http:/localhost/getmebanana/这里有一个链接,指向mod_rewrite Good Points的教程,让localhost/banana检索一个列表,发布localhost/banana创建一个新列表等等。是的,你可以将POST看作是将一封信发布到邮箱中。就像一个数据报,你不知道它的ID,也不知道一旦它离开了可视性会发生什么。然而,PUT用于您知道ID时,这就是为什么它通常用于修改现有记录的原因。POST与创建关联的唯一原因是,您通常不在数据库支持的API(包括大多数API)中分配ID。数据库将根据自动增量分配它。但是,如果您知道ID(比如,它是一个名称而不是一个自动递增的整数),您可以使用PUT来创建记录。如果您坚持将POST作为create,PUT作为edit,那么您就不可能在任何地方对它感到不安。大多数人在这个层次上理解它。你能详细说明你需要进一步澄清的部分吗?谢谢@marctrem。所以从技术上讲,可能有几种方法,比如getBanana、getApples、saveApples、saveBanana等,每种方法在我的DB.class.php文件中都有相应的方法。我的index.php文件初始化DB类的一个实例,该实例相应地获取/发布这些资源。我无法理解的是ModRewrite。我知道您可以将任何URL映射到任何路径,但是getBanana()是我的index.php文件中的一个方法,它不是路径。这就是我感到困惑的地方:(在switch语句中生成您的对象。我非常喜欢switch语句,因为它们阻止服务器上的XSS,包括您可以执行switch($_GET[“p2”]){case“getBananas”://生成getBananas break;case“getWhatever”://spawn getWhatever break;case default://spawn error,不理解break;}