Потребовалось провести небольшую интеграцию проекта использующего REST API с решением на 1С. Опыта работы с REST API не было никакого, поэтому в ходе реализации интеграции столкнулся с небольшими трудностями которые в последствии успешно решил. Знания полученные по ходу проекта интеграции хорошо бы сохранить, так как они меют свойство быстро забываться при отсутствии практики, поэтому решил поделиться ими в блоге.
Итак для работы с API OnlyOffice нам нужно получить токен. Заголовок который мы должны послать серверу выгляит следующим образом.
POST /api/2.0/authentication.json HTTP/1.1 Host: portal.onlyoffice.com Accept: application/json,application/xml Accept-Encoding: gzip, deflate userName=yourusername&password=yourpassword
где ourusername и yourpassword ваш логин и пароль соответственно.
<?php $url = 'http://192.168.1.221/api/2.0/authentication'; $params = array( 'userName' => '*********@mail.ru', // Логин или почта через которую регистрировались 'password' => '*********', // Пароль ); $result = file_get_contents($url, false, stream_context_create(array( 'http' => array( 'method' => 'POST', 'header' => array('Accept: application/json', 'Content-type: application/x-www-form-urlencoded'), 'content' => http_build_query($params) ) ))); $obj=json_decode($result, true); $token = $obj['response']['token']; print_r($token);
Вообще получить токе можно воспользовавшись как функцией file_get_contents() так и с помощью curl. Рассмотрим первый вариант.
Тоже самое но с помощью curl выгдяти так:
<?php ini_set('display_errors',1); error_reporting(E_ALL); #Формируем ссылку для запроса $link='http://192.168.1.221/api/2.0/authentication'; $curl=curl_init(); #Сохраняем дескриптор сеанса cURL #Устанавливаем необходимые опции для сеанса cURL curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0'); curl_setopt($curl,CURLOPT_URL,$link); curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST'); curl_setopt($curl,CURLOPT_POSTFIELDS,'userName=********@mail.ru&password=*******'); curl_setopt($curl,CURLOPT_HTTPHEADER, array('Accept:application/json', 'Host: 192.168.1.221', 'Accept-Encoding: gzip')); curl_setopt($curl,CURLOPT_HEADER, false); $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную curl_close($curl); #Завершаем сеанс cURL /** * Данные получаем в формате JSON, поэтому, для получения читаемых данных, * нам придётся перевести ответ в формат, понятный PHP */ $Response=json_decode($out,true); $token = $Response['response']['token']; print_r($token);
Разумеется вместо адреса http://192.168.1.221/ выдолжны будете ввести свой.
Далее опишем пример из API создание пользователя.
Сначала вариант с file_get_contents(), отметим, что код нужно добавить к вышеприведенным в соответствии с используемым методом.
#Добавляем пользователя $urlAdd = 'http://192.168.1.221/api/2.0/people.json'; #Формируем параметры запроса, описываем параметры пользователя которого хотим добавить $userdAdd = array('isVisitor' =>'false', 'email' => 'makhmood1@ya.ru', 'firstname' => 'Mahmood', 'lastname' => 'Abbas', 'title'=> 'Tiger', 'location' => 'Irak', 'sex' => 'male', 'birthday' => '1989-05-13T06:30:00.0000000-07:00', 'worksfrom' => '2014-09-13T06:30:00.0000000-07:00', 'comment' => '89282000000' ); $opt = array('http' => array( 'method' => 'POST', 'header' => "Accept: application/json\r\n". "Content-type: application/x-www-form-urlencoded\r\n". "Authorization: 4mWmJ5td7eXICAjj6fpXNj0m2U+RdC8EO8Zwh4ojHFTjHQYKjfaPN7Kidq6qclpqMSYRFBYc8/muXqq+CKdHvboMebFL+VB64YN4qvqTa9J7bKx3a2uIT+6/srpwhYCC\r\n", 'content' => http_build_query($userdAdd) ) ); $context = stream_context_create($opt); $addMember = file_get_contents($urlAdd, false, $context); var_dump($addMember); ?>
Теперь покажем как использовать метод curl
#Формируем параметры запроса, описываем параметры пользователя которого хотим добавить $userdAdd = array('isVisitor' =>'false', 'email' => 'makhmood@ya.ru', 'firstname' => 'Mahmood', 'lastname' => 'Abbas', 'title'=> 'Tiger', 'location' => 'Irak', 'sex' => 'male', 'birthday' => '1989-05-13T06:30:00.0000000-07:00', 'worksfrom' => '2014-09-13T06:30:00.0000000-07:00', 'comment' => '89282000000' ); #Формируем ссылку для запроса $linkPeople='http://192.168.1.221/api/2.0/people'; $headr = array('Content-type: application/json', 'Authorization: 4mWmJ5td7eXICAjj6fpXNj0m2U+RdC8EO8Zwh4ojHFTjHQYKjfaPN7Kidq6qclpqMSYRFBYc8/muXqq+CKdHvboMebFL+VB64YN4qvqTa9J7bKx3a2uIT+6/srpwhYCC', 'Host: 192.168.1.221'); $curl=curl_init(); #Сохраняем дескриптор сеанса cURL #Устанавливаем необходимые опции для сеанса cURL curl_setopt($curl,CURLOPT_RETURNTRANSFER, true); curl_setopt($curl,CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0'); curl_setopt($curl,CURLOPT_URL, $linkPeople); curl_setopt($curl,CURLOPT_CUSTOMREQUEST,'POST'); curl_setopt($curl,CURLOPT_POSTFIELDS, json_encode($userdAdd)); curl_setopt($curl,CURLOPT_HTTPHEADER, $headr); curl_setopt($curl,CURLOPT_HEADER, true); $out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную $code=curl_getinfo($curl,CURLINFO_HTTP_CODE); #Получим HTTP-код ответа сервера curl_close($curl); $code=(int)$code; $errors=array( 301=>'Moved permanently', 400=>'Bad request', 401=>'Unauthorized', 403=>'Forbidden', 404=>'Not found', 500=>'Internal server error', 502=>'Bad gateway', 503=>'Service unavailable' ); try { #Если код ответа не равен 200 или 204 - возвращаем сообщение об ошибке if($code>=400) throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undescribed error',$code); } catch(Exception $E) { die('Ошибка: '.$E->getMessage().PHP_EOL.'Код ошибки: '.$E->getCode()); } ?>
Мы сделали ни что иное как добавили в заголовок запроса наш токен.
Таким образом в случае успешного выполнения запроса вы получите в ответ JSON массив с параметрами созданного пользователя. Заметьте так же, что если пользователь с указанным e-mail уже создан, то будет вываливаться ошибка Internal server error 500.