Связь между JavaFX десктопной программой и отдалённым Java Spring сервером
Передо мной стоит задача разработать сервис, состоящий из двух компонентов. Сервер в виде Java Spring Boot аппликации и десктопной программы в виде JavaFX приложения. До этого разрабатывал исключительно WEB интерфейсы, т.е. backend в виде node.js/java сервера и SPA на React'е. Там не возникало никаких проблем со связью с backend'ом, ибо всё лежало на одном домене, простая конфигурация nginx позволяло связать фронт и бэк, настроить https и прочую лабуду.
В текущей же задаче клиентская программа должна иметь доступ к smartcard reader'у, а в будущем, и к другим устройствам. От того появилась необходимость вылезти за пределы браузера, выбор пал на JavaFX, однако вместе с тем возникла проблема со связью между Java Spring сервером и клиентским приложением.
С HTTP GET запросами всё в порядке, использую Apache HTTP Components на клиенте, но проблемы возникли уже на банальном POST запросе. Сервер выдаёт такой ответ: "{timestamp=2021-03-22T23:20:36.714+00:00, path=/auth/user/checkpost, status=405.0, error=Method Not Allowed, message=, requestId=ed22127d-7}". При настройке HTTPS и вовсе ни один запрос не проходит, ибо ключ не найден. Пробовал найти информацию в интернете, почитал про WEB Services, однако ничего стоящего не нашёл (Возможно, плохо искал). Я не настаиваю на использование HTTP/HTTPS протоколов и буду не против реализаций с использованием других, однако они в приоритете.
Итак, задача - связать клиентское десктопное приложение с отдалённым Java Spring сервером. Позже также планируется и мобильное приложение, которое тоже должно иметь доступ к серверу. Буду благодарен за любые советы и материалы касательно того, как безопасно связать клиентские приложения непосредственно на устройстве пользователя с отдалённым сервером.
Я не уверен в валидности кода HTTP запроса со стороны клиента, потому оставлю его здесь, возможно вы увидите ошибку.
package com.ardy.indafa.utils;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.entity.ContentType;
import javafx.concurrent.Task;
public class Query<T, U> extends Task<T> {
private static final String BASE_URL = "http://localhost:8080/api/";
private static final HttpClient HTTP_CLIENT = HttpClients.createDefault();
private String url;
private U sendObject = null;
public Query(String url) {
this.url = String.format("%s%s", BASE_URL, url);
}
public Query(String url, U sendObject) {
this.url = String.format("%s%s", BASE_URL, url);
}
public T call() {
T returnValue = null;
HttpResponse response;
HttpEntity entity;
try {
if (this.sendObject != null) {
HttpPost httpPost = new HttpPost(this.url);
httpPost.setEntity(new StringEntity(new Gson().toJson(this.sendObject), ContentType.create("application/json", "UTF-8")));
response = HTTP_CLIENT.execute(httpPost);
} else {
response = HTTP_CLIENT.execute(new HttpGet(this.url));
}
entity = response.getEntity();
if (entity != null) {
returnValue = new Gson().fromJson(readContent(entity.getContent()), new TypeToken<T>() {
}.getType());
}
} catch (Exception e) {
e.printStackTrace();
}
return returnValue;
}
private String readContent(InputStream stream) throws Exception {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
int read;
char[] chars = new char[1024];
while ((read = reader.read(chars)) != -1) {
buffer.append(chars, 0, read);
}
return buffer.toString();
} finally {
if (reader != null) {
reader.close();
}
}
}
}