RESTful PHP:它如何从客户端到服务器端工作?

时间:2014-01-17 09:56:00

标签: php rest curl

我对RESTful PHP上的教程/示例感到困惑。他们中的大多数使用框架(例如Slim)和结束为API ,这让我更加困惑。在完全理解如何创建简单的RESTful PHP之前,我想首先避免所有框架和API材料。

我理解,

  

REST,它的核心,实际上就是使用正确的HTTP动词   工作。 GET,POST,PUT,DELETE都有意义,如果有的话   被描述为RESTful,它真正的意思是网站/应用程序   问题是否符合这些含义。

从php服务器端,我明白这是how我可以检测到REST请求类型,

$_SERVER['REQUEST_METHOD']

但我的主要问题是如何通过URL将这些REST类型(GET,POST,PUT,DELETE)发送到服务器?

例如,来自tutorial

当您希望创建或更新URL标识的资源时,将使用PUT请求。例如,

  

http://restfulphp.com/clients/robin

然后,

DELETE应该与PUT相反;当您要删除请求URL标识的资源时,应该使用它。

  

http://restfulphp.com/clients/anne

http://restfulphp.com/clients/robinhttp://restfulphp.com/clients/anne 相同的干净网址格式。我怎么知道前者是用于PUT而后者是用于DELETE?或者 where 我应该在/ html格式中设置它们来区分它们吗?

当卷曲进来时它会变得复杂 - 它与REST网站有什么关系?

从上面的教程中,

Once you have cURL installed, type: 
curl -v google.com

哪里我应该输入??

curl如何帮助我删除或PUT? $_SERVER['REQUEST_METHOD']如何从curl中检测REST类型?

curl -v -X DELETE /clients/anne

curl -v -X PUT -d "some text"

我问的问题可能听起来很愚蠢但如果有人能帮我理解这些问题会很棒。

修改

Argg PHP cURL - 另一件让我更加困惑的事情!如果我要通过XMLHttpRequest对象发送REST请求类型,为什么还需要它?它似乎是为了与其他API提供商沟通,我希望在此阶段避免

如果我可以在我的本地网站中发送包含PHP cURL的REST请求类型,我应该如何以及在何处放置这些行Q&A

$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_COOKIEFILE,$cookieFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,   CURLOPT_SSL_VERIFYPEER,   FALSE);
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);

如果我使用PHP cURL那么服务器端的$_SERVER['REQUEST_METHOD']会发生什么?

4 个答案:

答案 0 :(得分:5)

  

http://restfulphp.com/clients/robinhttp://restfulphp.com/clients/anne是相同的干净网址格式。我怎么知道前者是用于PUT而后者是用于DELETE?

您无法通过网址判断。客户端必须将URL与HTTP动词耦合。 REST的一部分原因是你可能想要对同一个资源做不同的事情(如果你以后永远不想获取它,那么PUTting就没什么意义了。)

  

或者我应该在/ html格式中设置哪些区分它们?

HTML表单只能触发POST和GET请求。如果要在网页中使用其他HTTP动词,则需要使用JavaScript和XMLHttpRequest对象。

  

当卷曲进来时它会变得复杂 - 它与REST网站有什么关系?

curl是一个库(以及使用该库的命令行客户端)用于发出HTTP请求。

在开发REST界面时,可以使用命令行客户端来测试服务器。您也可以将它用作实际的客户端,但是您可能最好不要编写专用工具,这样您就拥有了一个很好的命令行界面,而不是强制您在使用它时处理HTTP方面的界面。< / p>

作为库,您可以使用它为REST接口编写客户端。

  

我应该在哪里输入??

在终端仿真器(例如XTerm或Windows Power Shell)中的命令行shell(例如bash或Windows Power Shell)中。

  

curl如何帮助我删除或PUT?

它允许您指定发送的HTTP动词。您可以在问题后的示例中看到这一点。

  

$ _SERVER ['REQUEST_METHOD']如何从curl中检测REST类型?

它告诉你使用了哪个动词来发出请求。

  

如果我要通过XMLHttpRequest对象发送REST请求类型,为什么还需要PHP cURL?

你没有。如果要从服务器发出请求,可以使用PHP。如果要从浏览器发出请求,可以使用XMLHttpRequest。

  

它似乎是为了与我想在此阶段避免的其他API提供商进行通信。

您可以使用它在您控制的面向客户的Web服务器与后端系统之间进行通信,该后端系统具有您也控制的(非面向客户的)HTTP接口。

  

如果我可以在我的本地网站中使用PHP cURL发送REST请求类型,我应该如何以及在何处放置这些行

您希望向REST服务发出请求的服务器端代码(或您的其他PHP客户端)。

  

如果我使用PHP cURL那么服务器端的$ _​​SERVER ['REQUEST_METHOD']会发生什么?

然后,假设您使用的是服务器端PHP(例如,不使用命令行PHP):

  1. 浏览器将向您的服务器发出请求
  2. $_SERVER['REQUEST_METHOD']将成为浏览器使用
  3. 发出请求的方法
  4. 服务器上运行的PHP将向其他服务器(或可能是同一服务器的其他部分)发出请求
  5. $_SERVER['REQUEST_METHOD']将是PHP使用
  6. 发出请求的方法
  7. 第二个请求的服务器将响应PHP客户端脚本
  8. 第一个请求的服务器将响应浏览器

答案 1 :(得分:2)

首先:你对POST,GET,DELETE,PUT方法是正确的。如果您需要从代码中调用另一个Web服务(您可以执行POST,PUT,DELETE,GET),则cURL(http://nl1.php.net/curl)非常重要。如果您只想测试您的Web服务,可以使用RESTcliet(https://addons.mozilla.org/nl/firefox/addon/restclient/)。使用此工具,您可以轻松克隆这些方法并查看结果。

当然,您必须在HTML中定义调用正确的webservce的表单方法:

<form method="PUT_YOUR_METHOD" action="WS_URL">

也可以从jQuery,javascript,Java(Android),Objective C(iOS)等调用这些方法。

答案 2 :(得分:1)

  

但我的主要问题是如何发送这些REST类型(GET,POST,PUT,   DELETE)通过服务器的URL?

您发送请求类型的方式取决于您使用的内容。例如,正如您所提到的,curl可以使用:

curl -v -X DELETE /clients/anne

发送删除请求。然后,服务器上的$_SERVER['REQUEST_METHOD']将包含相应的请求类型,脚本可以决定要执行的操作(在这种情况下,删除用户有权访问的资源)。

jQuery中,您可以使用:

$.ajax({
    url: '/clients/anne',
    type: 'DELETE',
    success: function(result) {
        // Success!
    }
});
  

我应该在哪里输入??

在该示例中,curl命令将被输入命令行。 PHP还有一个可以使用的curl库,但语法不同。

  

或者我应该在/ html格式中设置哪些区分它们?

理论上,您可以在表单方法属性中放置“PUT”。但请参阅this question

答案 3 :(得分:1)

你问了两个问题。

  1. “(...)相同的干净网址模式。我怎么知道前者是针对PUT而后者是指 对于DELETE?

    不是。 REST的想法:

    1. 应用程序中的信息结构为 resources 的集合。
    2. 每个资源都是可寻址:它有一个网址。
    3. 有关信息的所有操作均以资源上的基本CRUD操作表示。
    4. HTTP谓词用于实现不同的操作。

    5. 所以你不使用URL来表达操作;你用它们来表达 正在操作的物体。

    6. 我应该在哪里输入?''

      进入命令行解释器,例如CMD(在Windows上)或bash(在Linux上)。 您可能需要先安装curl