Вызов API REST в PHP
Наш клиент предоставил мне REST API, для которого мне нужно сделать PHP-вызов. Но на самом деле документация, предоставленная с API, очень ограничена, поэтому я действительно не знаю, как вызвать службу.
Я пытался использовать это Google, но единственное, что появилось, - это уже истекший Yahoo! о том, как вызвать службу. Не упоминать заголовки или что-либо подробное.
Есть ли приличная информация о том, как вызвать REST API или какую-то документацию об этом? Потому что даже в W3schools они описывают только метод SOAP. Каковы различные варианты создания API отдыха в PHP?
Ответы
Ответ 1
Вы можете получить доступ к любому REST API с помощью PHP cURL
Extension. Однако документация API (методы, параметры и т.д.) Должна быть предоставлена вашим клиентом!
Пример:
// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value
function CallAPI($method, $url, $data = false)
{
$curl = curl_init();
switch ($method)
{
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_PUT, 1);
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
curl_close($curl);
return $result;
}
Ответ 2
Если у вас есть URL-адрес, и ваш php поддерживает его, вы можете просто вызвать file_get_contents:
$response = file_get_contents('http://example.com/path/to/api/call?param1=5');
если $response - JSON, используйте json_decode, чтобы включить его в php-массив:
$response = json_decode($response);
если $response - XML, используйте класс simple_xml:
$response = new SimpleXMLElement($response);
http://sg2.php.net/manual/en/simplexml.examples-basic.php
Ответ 3
Используйте Guzzle. Это "PHP HTTP-клиент, который упрощает работу с HTTP/1.1 и устраняет боль от использования веб-сервисов". Работа с Guzzle намного проще, чем работа с cURL.
Вот пример с веб-сайта:
$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode(); // 200
echo $res->getHeader('content-type'); // 'application/json; charset=utf8'
echo $res->getBody(); // {"type":"User"...'
var_export($res->json()); // Outputs the JSON decoded data
Ответ 4
CURL - это самый простой способ. Вот простой вызов
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA);
$result = curl_exec($ch);
print_r($result);
curl_close($ch);
Ответ 5
Используйте HTTPFUL
Httpful - простая, цельная, читаемая библиотека PHP, предназначенная для того, чтобы говорить по-разному. Это позволяет разработчику сосредоточиться на взаимодействии с API-интерфейсами вместо просеивания страниц curl set_opt и является идеальным клиентом PHP REST.
Httpful включает в себя...
- Поддержка Readable HTTP Method (GET, PUT, POST, DELETE, HEAD и OPTIONS)
- Пользовательские заголовки
- Автоматический "интеллектуальный" анализ
- Автоматическая сериализация служебной нагрузки
- Базовый Auth
- Клиентский сертификат на стороне клиента
- Запрос "Шаблоны"
Исх.
Отправлять запрос GET. Получите автоматически разобранный ответ JSON.
Библиотека уведомляет JSON Content-Type в ответе и автоматически анализирует ответ на собственный PHP-объект.
$uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D";
$response = \Httpful\Request::get($uri)->send();
echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n";
Ответ 6
На самом деле есть много клиентов. Один из них Pest - проверьте это. И имейте в виду, что эти вызовы REST - это простой HTTP-запрос с различными методами: GET, POST, PUT и DELETE.
Ответ 7
Вам нужно знать, поддерживает ли REST API, который вы вызываете, GET или POST или оба метода. Код ниже - это то, что работает для меня, я называю свой собственный API веб-сервисов, поэтому я уже знаю, что делает API и что он вернет. Он поддерживает методы GET и POST, поэтому менее чувствительная информация попадает в URL (GET), а информация, подобная имени пользователя и паролю, представляется как переменные POST. Кроме того, все идет по протоколу HTTPS.
Внутри кода API я кодирую массив, который я хочу вернуть в json-формат, а затем просто использую команду PHP echo $my_json_variable, чтобы сделать эту json-строку доступной для клиента.
Итак, как вы можете видеть, мой API возвращает данные json, но вам нужно знать (или просматривать возвращаемые данные, чтобы узнать), в каком формате отвечает ответ API.
Вот как я подключаюсь к API со стороны клиента:
$processed = FALSE;
$ERROR_MESSAGE = '';
// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass"); // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);
// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);
if ($obj->{'code'} == '1')
{
$processed = TRUE;
}else{
$ERROR_MESSAGE = $obj->{'data'};
}
...
if (!$processed && $ERROR_MESSAGE != '') {
echo $ERROR_MESSAGE;
}
Кстати, я также попытался использовать метод file_get_contents(), поскольку некоторые из предложенных здесь пользователей, но это не работает для меня. Я обнаружил, что метод curl работает быстрее и надежнее.
Ответ 8
Если вы используете Symfony, там есть отличный клиентский пакет для отдыха, который включает в себя все из 100 исключений и выдает их вместо того, чтобы возвращать бессмысленный код ошибки +.
Вы действительно должны это проверить:
https://github.com/CircleOfNice/CiRestClientBundle
Мне нравится интерфейс:
try {
$restClient = new RestClient();
$response = $restClient->get('http://www.someUrl.com');
$statusCode = $response->getStatusCode();
$content = $response->getContent();
} catch(OperationTimedOutException $e) {
// do something
}
Работает для всех методов http.
Ответ 9
Вы можете использовать file_get_contents для выдачи любых методов http POST/PUT/DELETE/OPTIONS/HEAD, в дополнение к методу GET, как предлагает название функции.
Как публиковать данные в PHP с помощью file_get_contents?
Ответ 10
Если вы открыты для использования сторонних инструментов, вы бы посмотрели на это:
https://github.com/CircleOfNice/DoctrineRestDriver
Это совершенно новый способ работы с API.
Прежде всего вы определяете сущность, которая определяет структуру входящих и исходящих данных и аннотирует ее с источниками данных:
/*
* @Entity
* @DataSource\Select("http://www.myApi.com/products/{id}")
* @DataSource\Insert("http://www.myApi.com/products")
* @DataSource\Select("http://www.myApi.com/products/update/{id}")
* @DataSource\Fetch("http://www.myApi.com/products")
* @DataSource\Delete("http://www.myApi.com/products/delete/{id}")
*/
class Product {
private $name;
public function setName($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
Теперь довольно легко связаться с REST API:
$product = new Product();
$product->setName('test');
// sends an API request POST http://www.myApi.com/products ...
$em->persist($product);
$em->flush();
$product->setName('newName');
// sends an API request UPDATE http://www.myApi.com/products/update/1 ...
$em->flush();