Связь между 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();
            }
        }
    }
}

Ответы (0 шт):