...
Пример поиска абонентов по коду.
Если планируется значительное количество запросов, следует установить отдельную копию приложения hoper, чтобы работа с REST API не вызывала задержек в работе операторов через веб-интерфейс.
Основной язык программирования, используемый для разработки интеграций, требующих взаимодействия с API – Python.
Python
Импортируем необходимые модули:
...
Задаём параметры подключения к офису оператора связи (если планируется значительное количество запросов, стоит установить отдельную копию приложения hoper, чтобы работа с REST API не вызывала задержек в работе операторов через веб-интерфейс):
Code Block |
---|
|
hoper_url = 'https://hydra.hoper.url/rest/v2/'
hoper_login = '########'
hoper_password = '*********'
http_timeout = 60 |
...
Code Block |
---|
|
auth_url = urllib_parse.urljoin(hoper_url, 'login')
auth_params = {'session': {'login': hoper_login, 'password': hoper_password}}
response = http_session.post(
auth_url,
timeout=http_timeout,
datajson=json.dumps(auth_params),
)
if response.status_code != HTTPStatus.CREATED:
logger.error(
'Auth error ({0}): {1}'.format(response.status_code, response.content),
)
sys.exit(1) |
Получаем токен, который сервер выдал в теле Логируем ответ сервера и получаем токен из тела ответа
Code Block |
---|
|
logger.debug(response.content)
auth_result = json.loads(response.content)
auth_token = auth_result['session']['token']
|
...
Code Block |
---|
|
organizations_url = urllib_parse.urljoin(
hoper_url, 'search')
response = 'search?result_subtype_id={0}&query={1}'.formathttp_session.get(
organizations_url,
search_subtype timeout=http_timeout,
params={
'result_subtype_id': search_stringsubtype,
),
)
response = http_session.get('query': organizations_url, search_string
timeout=http_timeout,}
)
|
Если запрос выполнен успешно, по каждой найденной сущности выведем её идентификатор и наименование из результата поиска
...
Code Block |
---|
language | py |
---|
title | rest-example.py |
---|
linenumbers | true |
---|
collapse | true |
---|
|
"""Hydra REST v2 example."""
import json
import logging
import sys
from http import HTTPStatus
from urllib import parse as urllib_parse
import requests
hoper_url = 'https://hydra.hoper.url/rest/v2/'
hoper_login = '########'
hoper_password = '********'
http_timeout = 60
search_string = 'latera'
search_subtype = 2001
logger = logging.getLogger()
logger.setLevel(logging.INFO)
stdout_logger = logging.StreamHandler()
logger.addHandler(stdout_logger)
http_session = requests.Session()
http_session.headers.update(
{
'Content-Type': 'application/json',
'Accept': 'application/json',
},
)
auth_url = urllib_parse.urljoin(hoper_url, 'login')
auth_params = {'session': {'login': hoper_login, 'password': hoper_password}}
response = http_session.post(
auth_url,
timeout=http_timeout,
datajson=json.dumps(auth_params),
)
if response.status_code != HTTPStatus.CREATED:
logger.error(
'Auth error ({0}): {1}'.format(response.status_code, response.content),
)
sys.exit(1)
logger.debug(response.content)
auth_result = json.loads(response.content)
auth_token = auth_result['session']['token']
http_session.headers.update(
{'Authorization': 'Token token={0}'.format(auth_token)},
)
organizations_url = urllib_parse.urljoin(hoper_url, 'search')
response = hoperhttp_session.get(
organizations_url,
'search?result_subtype_id={0}&query={1}'.format(timeout=http_timeout,
params={
'result_subtype_id': search_subtype,
search_string,'query': ), ) response = http_session.get( organizationssearch_url,string
timeout=http_timeout,}
)
if response.status_code == HTTPStatus.OK:
search_results = json.loads(response.content)['search_results']
for entity in search_results:
logger.info(
'Customer `{0}`: `{1}`'.format(
entity['n_entity_id'],
entity['vc_result_name'],
),
)
else:
logger.warning(
'Invalid response ({0}): {1}'.format(
response.status_code,
response.content,
),
)
|
PHP
Задаём параметры подключения к офису оператора связи (если планируется значительное количество запросов, стоит установить отдельную копию приложения hoper, чтобы работа с REST API не вызывала задержек в работе операторов через веб-интерфейс):
Code Block |
---|
|
<?php
$hoper_url = 'https://hydra.hoper.url/rest/v2/';
$hoper_login = '########';
$hoper_password = '********';
$http_timeout = 60; |
...
Code Block |
---|
language | php |
---|
title | rest-example.php |
---|
linenumbers | true |
---|
collapse | true |
---|
|
<?php
$hoper_url = 'https://hydra.hoper.url/rest/v2/';
$hoper_login = '########';
$hoper_password = '********';
$http_timeout = 60;
$search_string = 'latera';
$search_subtype = 2001;
$http_headers = [
'Content-Type: application/json',
'Accept: application/json',
];
$curl_auth = curl_init();
curl_setopt($curl_auth, CURLOPT_POST, true);
curl_setopt($curl_auth, CURLOPT_URL, $hoper_url . "login");
curl_setopt($curl_auth, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_auth, CURLOPT_HTTPHEADER, $http_headers);
curl_setopt($curl_auth, CURLOPT_TIMEOUT, $http_timeout);
curl_setopt($curl_auth, CURLOPT_POSTFIELDS, json_encode(
["session" => ["login" => $hoper_login, "password" => $hoper_password]]
));
$auth_response = curl_exec($curl_auth);
$auth_status = curl_getinfo($curl_auth, CURLINFO_HTTP_CODE);
curl_close($curl_auth);
if ($auth_status != 201) {
echo "Auth error (" . $auth_status . "): " . $auth_response . "\n";
exit(1);
}
$auth_token = json_decode($auth_response, true)['session']['token'];
$http_headers[] = 'Authorization: Token token=' . $auth_token;
$curl_search = curl_init();
curl_setopt($curl_search, CURLOPT_URL,
$hoper_url . "search?result_subtype_id=" . $search_subtype . "&query=" . $search_string
);
curl_setopt($curl_search, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_search, CURLOPT_HTTPHEADER, $http_headers);
curl_setopt($curl_search, CURLOPT_TIMEOUT, $http_timeout);
$search_response = curl_exec($curl_search);
$search_status = curl_getinfo($curl_search, CURLINFO_HTTP_CODE);
if ($search_status == 200) {
$search_result = json_decode($search_response, true);
foreach ($search_result['search_results'] as $entity) {
echo "Customer: " . $entity['n_entity_id'] . ": " . $entity['vc_result_name'] . "\n";
}
} else {
echo "Invalid response (" . $search_status . "): " . $search_response . "\n";
} |
Java
Пример с использованием Apache HttpComponents (org.apache.httpcomponents) и json-java (org.json)
Импортируем необходимые библиотеки
Code Block |
---|
|
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException; |
Создаём стартовый класс и метод
Code Block |
---|
|
public class RestAPI {
public static void main(String[] args) { |
Задаём параметры подключения к офису оператора связи:
Code Block |
---|
|
String hoperUrl = "https://hydra.hoper.url/rest/v2/";
String hoperLogin = "########";
String hoperPassword = "********";
int httpTimeout = 60; |
Задаём параметры поиска. Строка поиска - latera, тип 2001 - поиск по абонентам
Code Block |
---|
|
String searchString = "latera";
int searchSubtype = 2001; |
Для работы с REST необходимо авторизоваться и получить токен для дальнейшего выполнения запросов.
Чтобы получить токен, подготавливаем JSON для запроса {"session": {"login": "########", "password": "********"}}
Code Block |
---|
|
JSONObject authParamsCredentials = new JSONObject();
authParamsCredentials.put("login", hoperLogin);
authParamsCredentials.put("password", hoperPassword);
JSONObject authParams = new JSONObject();
authParams.put("session", authParamsCredentials); |
Подготавливаем конфигурацию http-клиента, указываем в ней использование таймаута выполнения запроса и создаём http-клиент
Code Block |
---|
|
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(httpTimeout * 1000).build();
try (CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(config)
.build()) { |
Отправляем POST запрос /rest/v2/login с подготовленными параметрами
Code Block |
---|
|
HttpPost authRequest = new HttpPost(hoperUrl + "login");
HttpEntity stringEntity = new StringEntity(authParams.toString(),
ContentType.APPLICATION_JSON);
authRequest.setEntity(stringEntity);
CloseableHttpResponse authResponse = httpclient.execute(authRequest); |
Если запрос выполнен успешно, получаем токен из ответа сервера. Если авторизация не выполнилась успешно, завершаем работу скрипта
Code Block |
---|
|
String authToken = "";
if (authResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED) {
JSONObject authResponseData = new JSONObject(
EntityUtils.toString(authResponse.getEntity()));
authToken = authResponseData.getJSONObject("session").getString("token");
} else {
System.err.println("Auth error (" + authResponse.getStatusLine().getStatusCode() + "): "
+ EntityUtils.toString(authResponse.getEntity()));
System.exit(1);
} |
Отправляем GET-запрос на поиск, добавляя в него заголовок Authorization
со значением Token token=RECEIVED_TOKEN
Code Block |
---|
|
String getUrl = hoperUrl + "search?result_subtype_id=" +
searchSubtype +
"&query=" +
searchString;
HttpGet searchRequest = new HttpGet(getUrl);
searchRequest.addHeader("Authorization", "Token token=" + authToken);
CloseableHttpResponse searchResponse = httpclient.execute(searchRequest); |
Если запрос выполнен успешно, по каждой найденной сущности выведем её идентификатор и наименование из результата поиска. Если запрос выполнился с ошибкой, выведем предупреждение с полученным от сервера ответом.
Code Block |
---|
|
if (searchResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
JSONObject searchResponseData = new JSONObject(
EntityUtils.toString(searchResponse.getEntity()));
JSONArray searchResults = searchResponseData.getJSONArray("search_results");
for (int i = 0; i < searchResults.length(); i++) {
JSONObject row = (JSONObject) searchResults.get(i);
System.out.println(
"Customer " + row.getInt("n_entity_id") + ": " + row.getString("vc_result_name"));
}
} else {
System.err.println(
"Invalid response (" + searchResponse.getStatusLine().getStatusCode() + "): "
+ EntityUtils.toString(searchResponse.getEntity()));
} |
Завершаем блок try, метод main и класс
Code Block |
---|
|
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} |
Полная версия
Code Block |
---|
title | build.gradle |
---|
collapse | true |
---|
|
plugins {
id 'java'
id 'application'
}
group 'org.example'
version '1.0-SNAPSHOT'
mainClassName='RestAPI'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.json:json:20220320'
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
} |
Code Block |
---|
title | settings.gradle |
---|
collapse | true |
---|
|
rootProject.name = 'java-rest-example' |
Code Block |
---|
language | java |
---|
title | src/main/java/RestAPI.java |
---|
linenumbers | true |
---|
collapse | true |
---|
|
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
public class RestAPI {
public static void main(String[] args) {
String hoperUrl = "https://hydra.hoper.url/rest/v2/";
String hoperLogin = "########";
String hoperPassword = "********";
int httpTimeout = 60;
String searchString = "latera";
int searchSubtype = 2001;
JSONObject authParamsCredentials = new JSONObject();
authParamsCredentials.put("login", hoperLogin);
authParamsCredentials.put("password", hoperPassword);
JSONObject authParams = new JSONObject();
authParams.put("session", authParamsCredentials);
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(httpTimeout * 1000).build();
try (CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(config)
.build()) {
HttpPost authRequest = new HttpPost(hoperUrl + "login");
HttpEntity stringEntity = new StringEntity(authParams.toString(),
ContentType.APPLICATION_JSON);
authRequest.setEntity(stringEntity);
CloseableHttpResponse authResponse = httpclient.execute(authRequest);
String authToken = "";
if (authResponse.getStatusLine().getStatusCode() == HttpStatus.SC_CREATED) {
JSONObject authResponseData = new JSONObject(
EntityUtils.toString(authResponse.getEntity()));
authToken = authResponseData.getJSONObject("session").getString("token");
} else {
System.err.println("Auth error (" + authResponse.getStatusLine().getStatusCode() + "): "
+ EntityUtils.toString(authResponse.getEntity()));
System.exit(1);
}
String getUrl = hoperUrl + "search?result_subtype_id=" +
searchSubtype +
"&query=" +
searchString;
HttpGet searchRequest = new HttpGet(getUrl);
searchRequest.addHeader("Authorization", "Token token=" + authToken);
CloseableHttpResponse searchResponse = httpclient.execute(searchRequest);
if (searchResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
JSONObject searchResponseData = new JSONObject(
EntityUtils.toString(searchResponse.getEntity()));
JSONArray searchResults = searchResponseData.getJSONArray("search_results");
for (int i = 0; i < searchResults.length(); i++) {
JSONObject row = (JSONObject) searchResults.get(i);
System.out.println(
"Customer " + row.getInt("n_entity_id") + ": " + row.getString("vc_result_name"));
}
} else {
System.err.println(
"Invalid response (" + searchResponse.getStatusLine().getStatusCode() + "): "
+ EntityUtils.toString(searchResponse.getEntity()));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
|