Клиенты PHP REST

Я пытаюсь подключиться к веб-службе RESTful, но у меня возникают проблемы, особенно при отправке данных через PUT и DELETE. С cURL для PUT требуется файл для отправки, а DELETE просто странно. Я вполне способен написать клиент, используя поддержку сокетов PHP, и сам написать заголовки HTTP, но я хотел знать, ребята, использовали ли вы когда-либо или видели клиент REST для PHP?


person Jamie Rumbelow    schedule 21.05.2009    source источник


Ответы (8)


Как оказалось, Zend_Rest_Client вовсе не является REST-клиентом — например, он не поддерживает методы PUT и DELETE. После попытки заставить его работать с реальной службой RESTful мне надоело, и я написал правильный клиент REST для PHP:

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 в будущем.

Обновление: похоже, что многие люди ухватились за это. Pest теперь поддерживает HTTP-аутентификацию и множество других функций благодаря участникам на GitHub.

person Matt Zukowski    schedule 20.01.2011
comment
Ах, очень мило, Мэтт. Спасибо, что поделились этим. - person Jamie Rumbelow; 09.02.2011
comment
Мэтт, большое спасибо. Кажется, несколько человек заинтересовались PEST atm. :) - person Bjørn Otto Vasbotten; 30.11.2011
comment
Мэтт, как вы собираетесь запретить curl всегда выполнять POST-запросы с Content-Type: x-www-formurlencoded? - person thatidiotguy; 18.10.2012
comment
+1, попробуй сейчас. Все еще на 5.2, так что такие вещи, как Guzzle, для меня отсутствуют. - person halfer; 19.12.2012
comment
Действительно забавно наблюдать за новой активностью на Github в последнее время. :) - person Bjørn Otto Vasbotten; 09.07.2013

Я написал HTTP-клиент PHP под названием Guzzle. Guzzle — это HTTP-клиент и платформа для создания клиентов веб-служб REST. Дополнительную информацию о Guzzle можно найти на его веб-сайте или сразу перейти к источнику на github: https://github.com/guzzle/guzzle

Guzzle предоставляет преимущества, которые предоставляет большинство HTTP-клиентов (более простой интерфейс, все методы HTTP и просмотр запроса/ответа), но также предоставляет другие расширенные функции:

  • потоковые тела сущностей
  • экспоненциальная отсрочка
  • встроенный кеширующий прокси-сервер
  • печенье
  • Ведение журнала
  • управляемые постоянные соединения
  • параллельные запросы
  • OAuth
  • архитектура плагина, позволяющая реализовать произвольные схемы аутентификации
  • Автоматическое создание клиентского API из файла описания службы JSON

Единственный недостаток: требуется PHP 5.3.3.

person Michael Dowling    schedule 12.10.2011
comment
Ничего себе, много клиентских библиотек на выбор... Guzzle теперь является частью ядра Drupal 8, так что я думаю, что он будет существовать какое-то время. Собираюсь на этот! - person Bastian Voigt; 10.01.2014

Обычно я использую встроенную в PHP поддержку cURL. Параметр CURLOPT_CUSTOMREQUEST позволяет выполнять PUT/DELETE и т. д.

person ceejayoz    schedule 21.05.2009
comment
Это слишком низкий уровень, и вы портите свой код - person rtacconi; 02.08.2011
comment
Это не слишком низкий уровень, и если вы портите свой код, вы делаете это неправильно. - person ceejayoz; 02.08.2011
comment
да, это слишком низкий уровень. Лучше что-то вроде $lib-›post($url, $params); - person rtacconi; 10.08.2011
comment
Затем вы можете создать свой собственный класс, который выполняет этот низкий уровень, и использовать его для кода высокого уровня. - person Lupuz; 13.02.2013

простой пример на 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 для остального клиента - удаление categoryid=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);
?>
person Community    schedule 15.12.2011

Долго не мог найти изящного решения, не нравились реализации cURL, придумал свою. Он поддерживает HTTP-аутентификацию, перенаправления, PUT и т. д., поскольку использует модуль pecl http.

Реализация приятная и простая, легко расширяемая.

Более подробную информацию можно найти здесь:

person shurikk    schedule 20.09.2011
comment
Хорошее использование модуля HTTP, просто позор, что он не поставляется с PHP в стандартной комплектации. - person clockworkgeek; 28.04.2012

Мне удалось успешно использовать клиент Zend Rest.

person catsby    schedule 21.05.2009
comment
Zend_Rest_Client на самом деле вовсе не REST-клиент... больше похоже на RPC через HTTP или что-то в этом роде. - person Matt Zukowski; 08.01.2011
comment
Я думаю, что Zend имеет неправильное представление о том, что такое REST. Я подтверждаю идею Мэтта. Я пытаюсь использовать библиотеку Matt, но сервер REST плохо реализован (civicrm 3.3) и не возвращает правильные коды ошибок HTTP. - person rtacconi; 02.08.2011
comment
Ха-ха, фрактал плохого дизайна PHP снова наносит удар. :-) - person Prof. Falken; 04.07.2012

Воскрешая тему, нашел эту библиотеку 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;
 });
person Evertonvps    schedule 31.07.2012
comment
Respect/Rest — это REST-сервер (вернее, контроллер), а не клиент. - person Alastair Irvine; 11.03.2014

Последнее поступление: Zend\Http\Client. , часть Zend Framework 2.

Устанавливается через композитор (хотя, на момент написания этой статьи, не через Packagist; по-прежнему необходимо использовать собственный репозиторий пакетов Zend http://packages.zendframework.com/).

person David Weinraub    schedule 28.11.2012
comment
Теперь о пакете: https://packagist.org/packages/zendframework/zend-http - person David Weinraub; 19.12.2013