Я пытаюсь подключиться к веб-службе RESTful, но у меня возникают проблемы, особенно при отправке данных через PUT и DELETE. С cURL для PUT требуется файл для отправки, а DELETE просто странно. Я вполне способен написать клиент, используя поддержку сокетов PHP, и сам написать заголовки HTTP, но я хотел знать, ребята, использовали ли вы когда-либо или видели клиент REST для PHP?
Клиенты PHP REST
Ответы (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.
Я написал HTTP-клиент PHP под названием Guzzle. Guzzle — это HTTP-клиент и платформа для создания клиентов веб-служб REST. Дополнительную информацию о Guzzle можно найти на его веб-сайте или сразу перейти к источнику на github: https://github.com/guzzle/guzzle
Guzzle предоставляет преимущества, которые предоставляет большинство HTTP-клиентов (более простой интерфейс, все методы HTTP и просмотр запроса/ответа), но также предоставляет другие расширенные функции:
- потоковые тела сущностей
- экспоненциальная отсрочка
- встроенный кеширующий прокси-сервер
- печенье
- Ведение журнала
- управляемые постоянные соединения
- параллельные запросы
- OAuth
- архитектура плагина, позволяющая реализовать произвольные схемы аутентификации
- Автоматическое создание клиентского API из файла описания службы JSON
Единственный недостаток: требуется PHP 5.3.3.
Обычно я использую встроенную в PHP поддержку cURL. Параметр CURLOPT_CUSTOMREQUEST позволяет выполнять PUT/DELETE и т. д.
простой пример на 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);
?>
Долго не мог найти изящного решения, не нравились реализации cURL, придумал свою. Он поддерживает HTTP-аутентификацию, перенаправления, PUT и т. д., поскольку использует модуль pecl http.
Реализация приятная и простая, легко расширяемая.
Более подробную информацию можно найти здесь:
Мне удалось успешно использовать клиент Zend Rest.
Воскрешая тему, нашел эту библиотеку 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;
});
Последнее поступление: Zend\Http\Client. , часть Zend Framework 2.
Устанавливается через композитор (хотя, на момент написания этой статьи, не через Packagist; по-прежнему необходимо использовать собственный репозиторий пакетов Zend http://packages.zendframework.com/).