Вызов API REST в PHP

Наш клиент предоставил мне REST API, для которого мне нужно сделать PHP-вызов. Но на самом деле документация, предоставленная API, очень ограничена, поэтому я действительно не знаю, как вызвать службу.

Я попытался это сделать Google, но единственное, что появилось, это уже истекший Yahoo! о том, как вызвать службу. Не упоминать заголовки или что-либо подробное.

Есть ли приличная информация о том, как вызвать REST API или какую-то документацию об этом? Потому что даже в W3schools они описывают только метод SOAP. Каковы различные варианты создания API для отдыха в PHP?

Вы можете получить доступ к любому REST API с расширением cURL PHP. Тем не менее, документация 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; } 

Если у вас есть 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

Используйте Guzzle . Это «HTTP-клиент PHP, который упрощает работу с 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 

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); 

Использовать HTTPFUL

Httpful – простая, цельная, читаемая библиотека PHP, предназначенная для того, чтобы говорить по-разному. Это позволяет разработчику сосредоточиться на взаимодействии с API-интерфейсами вместо просеивания страниц curl set_opt и является идеальным клиентом PHP REST.

Httpful включает …

  • Поддержка Readable HTTP Method (GET, PUT, POST, DELETE, HEAD и OPTIONS)
  • Пользовательские заголовки
  • Автоматический «Умный» анализ
  • Автоматическая сериализация полезной нагрузки
  • Базовый аут
  • Сертификат стороны клиента Auth
  • Запрос «Шаблоны»

Ex.

Отправьте запрос 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"; 

Вам нужно будет знать, поддерживает ли 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 (), поскольку некоторые из предложенных здесь пользователей, но это не работает для меня. Я обнаружил, что метод завитки является более быстрым и надежным.

На самом деле есть много клиентов. Один из них – Pest – проверьте это. И имейте в виду, что эти вызовы REST – это простой HTTP-запрос с различными методами: GET, POST, PUT и DELETE.

Если вы используете 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.

Вы можете использовать file_get_contents для выдачи любых методов http POST / PUT / DELETE / OPTIONS / HEAD, в дополнение к методу GET, как предлагает название функции.

Как публиковать данные в PHP с помощью file_get_contents?

Если вы открыты для использования сторонних инструментов, вы бы посмотрели на это: 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();