Описание работы HTTP-терминала в общем случае:
1. Установление сессии
Для создания сессии нужно отправить POST-запрос командой http(s)://<ServerIP>:<ServerPort>/system/login вида:
<in> <login user = "ssw" password="ssw" /> </in>
Результатом этого запроса в случае успеха будет код 200 и token сессии (в cookie), иначе — код 404.
После установления сессии во всех последующих запросах в рамках данной сессии необходимо пробрасывать в cookie полученный token.
проверить путь в Cookies, значение должно быть корневым, Path=/ . (После успешного установления сессии значение автоматически устанавливается Path=/system. Нужно изменить на Path=/ )
В случае успешной авторизации в теле ответа придет "xml", содержащая мета-информацию, которая может потребоваться в последующих запросах:
<?xml version="1.0"?>
<out xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="login.xsd">
<settings md="md1" ds="ds1" version="3.10.0.36"/>
</out>
2. Выполнение команд, периодические ping-запросы
HTTP-терминал позволяет отправлять по http в рамках одной сессии несколько параллельных запросов. Для того чтобы отличать ответы на данные запросы, в заголовке запросов можно разместить параметр "P-Request-Id", значение которого будет протранслировано в ответе.
Если запрос к HTTP-терминалу был выполнен без указания token-а в cookie либо сессии для данного token-а уже нет, в ответ на такой запрос будет отправлена ошибка "401". Получив такую ошибку, необходимо заново пройти процесс аутентификации в системе.
Для того чтобы проверить, состояние сессии с определенным token-ом, используется команда:
http(s)://<ServerIP>:<ServerPort>/system/is_active
Для данной команды необходимо передать только token в cookie запроса методом GET.
Если клиент долгое время (60 минут) не выполняет никаких запросов с данным token-ом, то сессия на стороне HTTP-терминала автоматически закроется. Чтобы продлить время жизни сессии со стороны клиента, должны приходить периодические запросы методом post:
http(s)://<ServerIP>:<ServerPort>/system/ping
Запросы должны содержать token в cookie запроса. В случае успешного продления сессии возвращается код 200. Если сессия с данным token не найдена — вернется 404.
3. Завершение сессии
Чтобы завершить сессию со стороны клиента, необходимо на сервер отправить команду:
http(s)://<ServerIP>:<ServerPort>/system/logout
методом GET с token в cookie запроса.
В случае успешного logout придет ответ 200. Если сессия не найдена — вернется 404.
4. Пример кода на Java для работы с HTTP-терминалом
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/**
* Elemental example for executing multiple POST requests sequentially.
*/
public class Main {
public static void main(String[] args) throws Exception {
String host = "http://192.168.23.87:9999";
CookieStore cookie = login("ssw", "ssw", host);
if (isActive(cookie, host))
{
uptime(cookie, host);
logout(cookie, host);
}
}
private static CookieStore login(String login, String password, String host) throws IOException
{
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient client = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
HttpPost httpPost = new HttpPost(host + "/system/login");
httpPost.setHeader("Content-Type", "text/xml");
String xml = "<in><login user = \"" + login + "\" password=\"" + password + "\" /></in>";
HttpEntity entity = new ByteArrayEntity(xml.getBytes("UTF-8"));
httpPost.setEntity(entity);
HttpResponse response = client.execute(httpPost);
String loginResult = EntityUtils.toString(response.getEntity());
int loginResultCode = response.getStatusLine().getStatusCode();
System.out.println("Login rc " + loginResultCode);
System.out.println("Login result " + loginResult);
CookieStore resultCookieStore = new BasicCookieStore();
for (Cookie c : cookieStore.getCookies())
{
if (c.getName().equals("token") && c instanceof BasicClientCookie)
{
// Нужно для того, чтобы token применялся для всех
((BasicClientCookie)c).setPath("/");
resultCookieStore.addCookie(c);
return resultCookieStore;
}
}
return cookieStore;
}
private static boolean isActive(CookieStore cookieStore, String host) throws IOException
{
CloseableHttpClient client = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
HttpGet httpGet = new HttpGet(host + "/system/is_active");
HttpResponse response = client.execute(httpGet);
int isActiveResultCode = response.getStatusLine().getStatusCode();
System.out.println("Is Active rc " + isActiveResultCode);
return isActiveResultCode == 200;
}
private static void uptime(CookieStore cookieStore, String host) throws IOException
{
CloseableHttpClient client = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
HttpPost httpPost = new HttpPost(host + "/commands/get_info");
httpPost.setHeader("Content-Type", "text/xml");
String xml = "<in xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\" xs:noNamespaceSchemaLocation=\"get_info.xsd\" />";
HttpEntity entity = new ByteArrayEntity(xml.getBytes("UTF-8"));
httpPost.setEntity(entity);
HttpResponse response = client.execute(httpPost);
String uptimeResult = EntityUtils.toString(response.getEntity());
int isActiveResultCode = response.getStatusLine().getStatusCode();
System.out.println("Uptime rc " + isActiveResultCode);
System.out.println("Uptime result " + uptimeResult);
}
private static void logout(CookieStore cookieStore, String host) throws IOException
{
CloseableHttpClient client = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
HttpGet httpGet = new HttpGet(host + "/system/logout");
HttpResponse response = client.execute(httpGet);
int isActiveResultCode = response.getStatusLine().getStatusCode();
System.out.println("Logout rc " + isActiveResultCode);
}
}
Для проверки работы команд с различными параметрами есть тестовая страничка по адресу: <IP_Web-conf>/cluster/xml_request/. Предварительно в соседней вкладке браузера нужно залогиниться в web-конфигуратор.