Задать вопрос
  • Keep Alive и Session ID в Postman - реально ли?

    @Alex_kuznec Автор вопроса
    Касательно бесплатного ПО - ничего удобного и простого, к сожалению, не нашел, поэтому пришлось написать утилиту самому. Ниже публикую код - вдруг кому-то пригодится, в будущем.
    Утилита читает текстовый файл с JSON структурой и отправляет запрос на сервер, при этом одновременно посылая Keep-Alive каждые 28 сек. Можно редактировать JSON файл на лету ( сохраняя) и через утилиту отправлять вновь отредактированный запрос, просто нажатием Enter.
    Касательно "говнокодов", "оторванных рук", "велосипедов" и т.п. - я писал, что не супер-программист и, в общем-то, не претендую!
    Утилита работает и позволяет решить мне мою задачу - на этом все.
    Если когда-нибудь, какой-нибудь Java-гуру заглянет на эту страницу и скажет, что надо все переписать (используя сокет, добавить логирование, грамотно расписать классы, методы, финалы, упростить код и т.д.), а самое главное сделает это (грамотно и правильно) - буду ему благодарен! Как и остальные пользователи этого ресурса.

    import java.net.*;
    import java.net.URL;
    import java.net.HttpURLConnection;
    import java.io.*;
    import java.io.Console;
    import java.util.*;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import org.apache.commons.codec.binary.Base64;
    // Последнюю библиотеку можно взять тут commons.apache.org/proper/commons-codec Она нужна для создания строки аутентификации.

    public class rt2{

    // fname - файл из которого будет браться JSON структура, sid - ID сессии, полученный от сервера
    // json_str - прочитанная JSON структура, s - строка для чтения ввода с клавиатуры
    static public String fname="json.txt", sid = "", json_str="", s;

    //Метод чтение файла c JSON структурой
    public static void m_readfile (String filename) throws IOException{
    int i = 0;
    char a;
    boolean endof = false;
    System.out.println ("Open file:" + filename + "\n" +"Current SID:" + rt2.sid +"\n");
    StringBuilder s = new StringBuilder();
    FileReader Fr = new FileReader (filename);
    do {
    i = Fr.read ();
    if (i==(-1)) break;
    s.append((char) i);

    } while (i!=-1);
    rt2.json_str = s.toString();
    Fr.close ();
    i = s.length ();
    System.out.println ("Message lenght:"+ i +"\n");

    }
    // r_type: POST или GET; r_URL -полный URL "192.168.1.1/rest/n", r_login - логин, r_pwd - пароль
    // ses_id - ID сесии, если равно "", то необходимо создание новой сесии, если не равно, то Keep Alive запрос или API запрос
    // json_structure - отправляемая JSON структура
    public static void send_request (String r_type, String r_url, String r_login, String r_pwd, String ses_id, String json_structure) {
    String req = "";

    //Формирование строки для базовой аутентификации
    String authString = r_login + ":" + r_pwd;
    byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
    String authStringEnc = new String(authEncBytes);
    try{
    // Формирование HTTP запроса, открытие сессии и отправка сообщения
    URL url= new URL(r_url);
    HttpURLConnection uc = (HttpURLConnection) url.openConnection();
    uc.setDoOutput(true);
    uc.setDoInput(true);
    uc.setRequestMethod (r_type);
    uc.setRequestProperty ("authorization", "Basic " + authStringEnc);
    uc.setUseCaches(false);
    uc.setRequestProperty("content-type","application/json");
    if (json_structure !="") {
    uc.setRequestProperty("content-lenght", ""+json_structure.length());
    }else {
    uc.setRequestProperty("content-lenght", ""+req.length());
    }
    uc.connect();
    DataOutputStream dos= new DataOutputStream(uc.getOutputStream());
    dos.writeBytes(json_structure);
    dos.flush();
    dos.close();
    System.out.println("\n"+"--==JSON BODY SENT ==--"+"\n\n"+json_structure+"\n\n"+"--==JSON BODY SENT ==--"+"\n");
    BufferedReader br = new BufferedReader (new InputStreamReader(uc.getInputStream()));

    String res = null;

    if (ses_id == "") {
    // Если ID сесии пуст, то это означает, что поступил первый запрос на создание сесии.
    // В противном случае он уже существует и это или Keep-Alive запрос или API запрос.

    // Чтение ответа от сервера и создание строки, для последующего парсинга - надо выделить Session ID из ответа.
    while ((res=br.readLine()) != null)
    {rt2.sid = rt2.sid + res;}
    br.close();
    uc.disconnect();

    //Парсинг ответа от сервера. Выделение ID сессии. В моем случае, ответ от сервера одинаков и я точно знаю, что это 3е слово, после символа " .
    String[] sid_to_use = rt2.sid.split("\"");
    rt2.sid = sid_to_use [3];
    } else {

    System.out.println("\n"+"--==SERVER RESPONSE START==--"+"\n");
    while ((res=br.readLine()) != null)
    {System.err.println(res);}
    System.out.println("\n"+"--==SERVER RESPONSE END==--"+"\n");
    br.close();
    uc.disconnect();
    }
    } catch (MalformedURLException me) {
    System.err.println(me);
    } catch (UnknownHostException he){
    System.err.println(he);
    } catch (UnknownServiceException se){
    System.err.println(se);
    } catch (IOException ioe) {
    System.err.println(ioe);
    }}

    public static void main (String[] args){

    rt2 rt = new rt2 ();
    rt2.send_request("POST","192.168.1.1/rest/n","admin","admin",rt2.sid,""); // Превый запрос к серверу и получение ID сесии

    Timer timer = new Timer(true); // Создание демон- процесса, который будет отправлять Keep-Alive каждые 28 сек
    TimerTask task = new TimerTask () {
    String res2 = null;
    public void run() {
    LocalDateTime time = LocalDateTime.now();

    rt2.send_request("GET","192.168.1.1/rest/poll"+rt2.sid,"admin","admin",rt2.sid,"");

    System.out.println ("-=Keep Alive sent=-" + " Time:"+ time.format(DateTimeFormatter.ofPattern("HH:mm:ss"))+" SID: "+rt2.sid+"\n");
    System.out.println( "Press ENTER to send JSON request ('q'+Enter to exit): ");

    };};
    timer.schedule (task,0,28000);

    do {
    s = System.console().readLine();
    if (s.equals("q")) break;
    try{
    m_readfile(fname);
    rt2.send_request("POST","192.168.1.1/rest/req"+rt2.sid,"admin","admin",rt2.sid,rt2.json_str);
    } catch (IOException e) {
    System.err.println(e);
    } }
    while (true);
    }
    }