更正PHP RESTful应用程序的标头?

时间:2011-12-21 22:05:00

标签: php rest restful-authentication

目标: RESTful API
问题:我的方法是在真正的RESTful API下面还是缺少像我被告知的那样?  这是一个3部分问题..

假设我有一个PHP项目,它有一个以XML或JSON格式返回数据的API,你可以像下面这样访问API ......

server.com/article/123 | Returns ID 123 using GET
server.com/article/new | Creates a new article using POST
server.com/article/123/edit | Edits an article with the ID 123 using POST
server.com/article/123/delete | Deletes article with ID 123 using POST

1)
我还经常阅读PUT应该用于编辑对象,下面我将单词POST设置为用户将POST发送到删除操作的URI,如果我使用的话在PHP中PUT使用类似的东西代替吗?

$_PUT  = array();  
if($_SERVER['REQUEST_METHOD'] == 'PUT') {  
    parse_str(file_get_contents('php://input'), $_PUT);  
}

2)
我在一段时间内写过的一个问题告诉我,这类似于RESTful API,但事实并非如此,我得到的答案就是这个......

In short, your service is not RESTful, but it is close. Rather than specify actions (edit, delete, ...) in URL segments, you will want to make use of HTTP verbs (GET, PUT, POST, DELETE).

这家伙不知道他在说什么,或者我只是不知道,在阅读了关于这个主题的无数篇文章,并且与我能找到的每个API进行比较后,我上面的例子如何不是RESTful?

我想制作一个RESTful API,如果需要,请帮我纠正上面的例子吗?

第3)
还假设我计划用这样的东西向用户返回JSON响应......

<?php
header('HTTP/1.1 200 OK');  
header('Content-type: application/json');

$data = // my code that returns the appropriate data;

echo json_encode($data);
?>

这是将结果返回给用户的正确方法还是我错过了什么?  许多文章和问题都谈到了这个概念,但没有像我的例子那样深入到实际的代码中。

2 个答案:

答案 0 :(得分:5)

要解决问题的第2部分,更多RESTful URL和方法结构如下:

  • server.com/articles/123 - GET:返回文章
  • server.com/articles/123 - PUT:将文章替换为请求正文中的文章
  • server.com/articles/123 - DELETE:删除文章
  • server.com/articles/ - POST:创建新文章

这里的想法是URL表示资源本身(在本例中为文章),动词在可行的情况下表示您要对其执行的操作。我能想到的最好的例子是 true RESTful API,它是GitHub API的最新版本:就我所见,它们使用HTTP方法,响应代码和自定义MIME类型适当。

在回答问题的第3部分时,这当然是一种有效的方法,但是如果您要使用自定义MIME类型,例如application/vnd.myawesomesite.article+json,那么可以更容易地在客户端进行解释结束,因为客户端可以使用MIME类型来确定如何解析结果:例如,客户端可以根据显示的MIME类型分派到不同的反序列化器和类。同样,GitHub上的人们在their API docs中给出了一些例子。

答案 1 :(得分:2)

  1. 只要请求包含正确的Content-Type标头,您就应该能够在PUT请求中使用$_POST。它是一个通用的超全局,当发送HTTP主体并使用正确的Content-Type头时,应始终填充它。事实上,它甚至可能出现在破碎的GET请求中。
  2. 您的网址可能更加RESTful。例如,server.com/article/123不仅可以容纳GET,还可以容纳POST(编辑)和删除(删除)。如果您已经使用了不同的请求方法,则无需使用单独的URL。
  3. RESTful主要描述客户端和服务器之间的通信方式,而不是它如何做到这一点。我还没有看到过去使用的201头很多 - 通常200 OK足够好了。当然,没有什么可以阻止你使用201代码。
  4. #protip:将所有数据包装在结果对象中,例如{'success':true,'result':<the result>,'resulttype':'article'}。使用您的API(如果您发布一个)的开发人员会发现这很有帮助。对您而言,这意味着您可以轻松地向响应添加额外信息。

    Very interesting article on FourSquare's REST API