Касательно бесплатного ПО - ничего удобного и простого, к сожалению, не нашел, поэтому пришлось написать утилиту самому. Ниже публикую код - вдруг кому-то пригодится, в будущем.
Утилита читает текстовый файл с 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 {
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();
Утилита читает текстовый файл с 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);
}
}