Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Описание работы 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);
    }

}
  • Нет меток