PHP REST客户端

35

我正在尝试连接到一个RESTful Web服务,但是在发送PUT和DELETE数据时遇到了一些问题。使用cURL时,PUT需要发送一个文件,而DELETE是比较奇怪的。我完全有能力使用PHP的socket支持编写客户端并自己编写HTTP头,但我想知道您是否曾经使用过或看到过用于PHP的REST client?

8个回答

39

事实证明,Zend_Rest_Client根本不是REST客户端 - 例如,它不支持PUT和DELETE方法。在尝试将其强行与实际的RESTful服务配合使用后,我感到厌烦,并为PHP编写了一个正确的REST客户端:

http://github.com/educoder/pest

我还需要加入一些东西,但如果得到采用,我会再做更多的工作。

以下是使用OpenStreetMap REST服务的示例:

<?php

/**
 * This PestXML usage example pulls data from the OpenStreetMap API.
 * (see http://wiki.openstreetmap.org/wiki/API_v0.6)
 **/

require_once 'PestXML.php';

$pest = new PestXML('http://api.openstreetmap.org/api/0.6');

// Retrieve map data for the University of Toronto campus
$map = $pest->get('/map?bbox=-79.39997,43.65827,-79.39344,43.66903');

// Print all of the street names in the map
$streets = $map->xpath('//way/tag[@k="name"]');
foreach ($streets as $s) {
  echo $s['v'] . "\n";
}

?>

目前它使用curl,但是我可能会在未来将其切换到HTTP_Request或HTTP_Request2。

更新:看起来很多人已经加入了这个项目。感谢GitHub上的贡献者,Pest现在支持HTTP身份验证和许多其他功能。


1
啊,非常好 Matt。谢谢你分享。 - Jamie Rumbelow
Matt,非常感谢。看起来现在有几个人对PEST很感兴趣。 :) - Bjørn Otto Vasbotten
1
马特,你怎样停止使用 Content-Type: x-www-formurlencoded 的 POST 请求来执行 curl? - thatidiotguy
尝试一下+1。目前还在5.2版本,所以像Guzzle这样的东西暂时对我来说不适用。 - halfer
1
最近在Github上看到所有更新的活动真是太有趣了。 :) - Bjørn Otto Vasbotten

38

我写了一个名为 Guzzle 的 PHP HTTP 客户端。Guzzle 是一个用于构建 REST Web 服务客户端的 HTTP 客户端和框架。您可以在其 网站 上找到有关 Guzzle 的更多信息,或直接访问 github 源代码: https://github.com/guzzle/guzzle

Guzzle 提供了大多数 HTTP 客户端提供的好处(更简单的接口、所有的 HTTP 方法以及查看请求/响应),但还提供了其他高级功能:

  • 流式实体主体
  • 指数退避
  • 内置缓存转发代理
  • cookie
  • 日志记录
  • 管理持久连接
  • 并行请求
  • OAuth
  • 允许您实现任意身份验证方案的插件架构
  • 从 JSON 服务描述文件自动生成客户端 API

唯一的缺点:需要 PHP 5.3.3。


2
哇,有很多客户端库可供选择... Guzzle现在是Drupal 8核心的一部分,所以我猜它会持续存在一段时间。我选择这个! - Bastian Voigt

13

8
水平太低,你搞砸了你的代码。 - rtacconi
4
这句话的意思是:这并不是太低级别的问题,如果你搞砸了你的代码,那么你就做错了。 - ceejayoz
13
是的,它的级别太低了。最好是像这样:$lib->post($url, $params); - rtacconi
3
那么您可以创建自己的类来执行低级操作,并将其用于高级代码。 - Lupuz

8

用于REST客户端的PHP简单示例-更新如下:

<?php
$url ="http://example.com";
$data = "The updated text message";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");  //for updating we have to use PUT method.
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>

以下是 PHP 中用于 REST 客户端的简单示例 - 删除类别 ID = xx:

<?php
$url ="http://example.com/categoryid=xx";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>

5

HTTP模块的使用很好,只可惜它不是PHP标准附带的。 - clockworkgeek

2

3
Zend_Rest_Client 实际上并不是一个真正的 REST 客户端,更像是在 HTTP 上进行的 RPC 或其他什么东西。 - Matt Zukowski
3
我认为Zend对REST的理解有误。我支持Matt的观点。我正在尝试使用Matt的库,但REST服务器实现不好(civicrm 3.3),没有返回适当的HTTP错误代码。 - rtacconi
5
哈哈,PHP的设计缺陷又来捣乱了。 :-) - Prof. Falken

1

重新提起这个话题,我发现这个库https://github.com/Respect/Rest/非常容易使用,但是网上的示例很少:

    require_once 'bootstrap.php';
require_once 'Respect/Rest/Router.php';
require_once 'Respect/Rest/Request.php';
use Respect\Rest\Router;

$router->post('/myApp/', function() {

  $data_back = json_decode(file_get_contents('php://input'));
            //  var_dump($data_back);
  return json_encode($data_back);
 });
$router->get('/myApp/*', function($id = null) {

$json = json_encode(MyService::getInstance()->list());

 return utf8_encode($json);
 });
$router->put('/myApp/*', function($id = null) {
  return 'Update: ' . $id;
 });
$router->delete('/myApp/*', function($id = null) {
  return 'Delete: ' . $id;
 });

2
Respect/Rest 是一个 REST "服务器"(更准确地说,是一个控制器),而不是客户端。 - Alastair Irvine

1
最近加入的是Zend\Http\Client,它是Zend Framework 2的一部分。
可以通过composer进行安装(尽管在撰写本文时还不能通过Packagist进行安装;仍需使用Zend的自定义软件包存储库http://packages.zendframework.com/)。

现在已经在 Packagist 上发布了:https://packagist.org/packages/zendframework/zend-http - David Weinraub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接