Описание работы HTTP-терминала в общем случае:
1. Установление сессии
Для создания сессии нужно отправить POST-запрос командой http(s)://<ServerIP>:<ServerPort>/system/login
вида:
<in> <login user = "ssw" password="ssw" /> </in>
Результатом этого запроса в случае успеха будет код 200 и token сессии (в cookie), иначе - код 404.
После установления сессии во всех последующих запросах в рамках данной сессии необходимо пробрасывать в cookie полученный token.
В случае успешной авторизации в теле ответа придет "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); } }