Как можно отправить запрос на POS-терминал с удаленного сервера?

У нас имеется следующее оборудование: 
- Рабочий ноутбук 
- POS терминал, подключенный по WiFi к роутеру 
- Сервер с системой учета (VDS) 

Наша задача заключается в следующем: 
- Отправить GET запрос с сервера на локальный IP адрес клиента (REST API POS терминала) 
- Получить JSON ответ 

Я уже пробовал проксировать запрос на стороне сервера, однако он по-прежнему пытается обратиться к локальному IP с сервера, хотя этот IP находится на стороне клиента. Также я пытался реализовать решение через JavaScript, но столкнулся с проблемой CORS политики. Если бы терминал выполнял роль сервера, то я бы предоставил доступ домену, с которого идет запрос, но, к сожалению, я провожу целый день в поисках решения. 

Некоторые факты, которые стоит учитывать: 
1. Локально API работает отлично 
2. POS терминал поддерживает как защищенные (SSL - HTTPS), так и незащищенные (HTTP) соединения 

Можете помочь с решением данной проблемы?
  • 14 октября 2024 г. 13:33
Ответы на вопрос 3
Ваша задача отправить запрос на локальный IP адрес POS-терминала с удаленного сервера требует решения, учитывающего некоторые ограничения в сетевой архитектуре и безопасности. Рассмотрим несколько возможных подходов:

### 1. Прокси-сервер
Поскольку вы уже пытались проксировать запросы, важно убедиться, что ваш прокси-сервер использует правильную настройку. Ниже приводится пример реализации прокси-сервера на стороне VDS, который будет перенаправлять запросы к локальному IP-адресу POS-терминала.

Вы можете использовать такие инструменты, как Nginx или Express.js (Node.js).

**Пример на Node.js с использованием Express:**
```javascript
const express = require('express');
const request = require('request');
const app = express();
const PORT = 3000;

// Укажите IP адрес вашего POS терминала и маршрут
const posTerminalIP = 'http://192.168.1.100/api'; // замените на свой IP и путь

app.get('/pos-proxy', (req, res) => {
    // Прокси запрос к POS терминалу
    request(posTerminalIP + req.originalUrl, { json: true }, (err, resp, body) => {
        if (err) { return res.status(500).send(err); }
        res.send(body);
    });
});

app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});
```

### 2. VPN
Организуйте виртуальную частную сеть (VPN) между вашим VDS и локальной сетью, где находится POS-терминал. Это позволит вашему серверу видеть локальные IP-адреса, и вы сможете отправлять прямые запросы к POS-терминалу.

### 3. Использование вебхуков
Если POS-терминал поддерживает вебхуки, вы могли бы настроить его для отправки событий на ваш сервер. Таким образом, когда происходит событие на терминале, он отправляет данные на ваш сервер, и вы получаете информацию, даже если не можете обращаться к нему напрямую.

### 4. CORS
Если вы решите использовать JavaScript на клиентской стороне и POS-терминал не предоставляет соответствующих заголовков CORS, вы не сможете обойти эту проблему без серверного прокси. Вы не сможете напрямую отправлять запросы к POS-терминалу из браузера, если он не предоставляет доступ к `Access-Control-Allow-Origin`.

### 5. Обратный прокси через nginx
Если вы используете nginx в качестве обратного прокси, вы можете настроить его таким образом, чтобы он перенаправлял определенные запросы к вашему локальному IP адресам:
```nginx
server {
    listen 80;
    server_name your-domain.com;

    location /pos-api/ {
        proxy_pass http://192.168.1.100/api/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

### Общие рекомендации
- Убедитесь, что ваш роутер (если POS-терминал подключен к роутеру) позволяет настройки портов и маршрутизацию.
- Проверяйте настройки брандмауэра для разрешения обращений.
- Если используется SSL, убедитесь, что у вас корректные сертификаты.

Определитесь, какой из подходов лучше всего соответствует вашим потребностям и ограничениям, и используйте его.
ВПН между vds и локальной сетью терминала.
Думаю самым адаптивным решение будет все таки создание Desktop приложения, которое будет кидать запросы на сервер через WS или HTTP и при их наличии перенаправлять их на POS терминал, получать ответ и посредством REST API отправлять обратно на сервер
Похожие вопросы