Очень нубовский вопрос, как послать данные на сервер и получить от него ответ?
Добрый день,
сильно не пинайте, пожалуйста. Последний раз, когда мне такое надо было, это было в 1999 и я это делал через cgi-bin и тогда данных было очень мало. Сейчас имею html-css-js морду, и сервер на убунте. Хочу из морды послать команды (сотни байт) и получить в ответ сгенерированный html со встроенными небольшими картинками. Кроме самих картинок html может весить много, ибо содержит кучу данных для отрисовки 2Д графики. Пожать бы его на лету тоже бы не мешало. Понятно несколько юзеров может на сервер послать одновременно разные запросы и каждый получаемый ответ будет содержать свой уникальный html и уникальные картинки. Предполагаем, что пока сервер справится с этими запросами :) На будущее я хочу, чтобы то, что у меня сейчас на сервере имеется, потом плавно мигрировало к юзеру на его комп хотя бы потому, что мой сервер не будет справляться с юзер запросами (но не сейчас). Написать программу на С, которая обрабатывала бы команды (из stdin например) и выплевывала бы html могу, но не понимаю, как мне к нему подцепить картинки. Их может быть около сотни, каждая примерно по 1-100кб, желательно их как-то объединить-запаковать, чтобы трафик не поднимать. Скажите, пожалуйста, на какие правильные ключевые слова мне гуглить, чтобы понять как такое сейчас делается, вроде cgi-bin совсем не безопасно, или? Спасибо! |
Цитата:
броузер клиента их сам скачивает <img src="https://helpx.adobe.com/content/dam/help/en/stock/how-to/visual-reverse-image-search/jcr_content/main-pars/image/visual-reverse-image-search-v2_intro.jpg" alt="альтернативный текст"> используйте http2 протоокол для получения профита от асинхронной загрузки ресурсов в спрайты упаковывают обычно неюодьште изображения до 5 кб |
Спасибо большое, за совет!
С картинками понял, похоже большие проще положить в специальную директорию, они для всех юзеров одинаковые, а маленькие буду в спрайты упаковывать (понял где гуглить, надеюсь, осилю). Сейчас пробовал сделать запрос на json, но упорно мой сервер не хочет видеть запрос. От себя я пробую стартовать что-то вроде (нашел пример в интернете): <!DOCTYPE html> <html> <head> <title> Отправляем JSON-данные на сервер </title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> </head> <body style="text-align:center;" id="body"> <!-- заголовок --> <h1> Простая форма для проверки работы JSON </h1> <!-- делаем форму с полями ввода --> <p> <input type="text" id="name" placeholder="Ваше имя"> <input type="text" id="lastname" placeholder="и фамилия"> <!-- по нажатию на эту кнопку данные уйдут на сервер --> <button onclick="sendJSON()">Проверить JSON</button> <!-- а вот тут они появятся снова, но уже после обработки сервером --> <p class="result" style="color:blue"></p> </p> <script> // эта функция сработает при нажатии на кнопку function sendJSON() { // с помощью jQuery обращаемся к элементам на странице по их именам let name = document.querySelector('#name'); let lastname = document.querySelector('#lastname'); // а вот сюда мы поместим ответ от сервера let result = document.querySelector('.result'); // создаём новый экземпляр запроса XHR let xhr = new XMLHttpRequest(); // адрес, куда мы отправим нашу JSON-строку let url = "https://www.elegant-nmr.com/json/json.out"; // открываем соединение xhr.open("POST", url, true); // устанавливаем заголовок — выбираем тип контента, который отправится на сервер, в нашем случае мы явно пишем, что это JSON xhr.setRequestHeader("Content-Type", "application/json"); // когда придёт ответ на наше обращение к серверу, мы его обработаем здесь xhr.onreadystatechange = function () { // если запрос принят и сервер ответил, что всё в порядке if (xhr.readyState === 4 && xhr.status === 200) { // выводим то, что ответил нам сервер — так мы убедимся, что данные он получил правильно result.innerHTML = this.responseText; } }; // преобразуем наши данные JSON в строку var data = JSON.stringify({ "name": name.value, "lastname": lastname.value }); // когда всё готово, отправляем JSON на сервер xhr.send(data); } </script> </body> </html> на сайте у меня nginx, в его установках я воткнул add_header "Access-Control-Allow-Origin" "*"; add_header "Access-Control-Allow-Headers" "Origin, X-Requested-With, Content-Type, Accept, Authorization"; add_header "Access-Control-Request-Methods" "GET, POST, OPTIONS"; но упорно оно пишет де Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at ... (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Скажите, пожалуйста, что я делаю не так? Спасибо! |
https://www.elegant-nmr.com/json/json.php
пока интерпритатор php не обрабатывает файл смотрите настройки php в nginx |
Спасибо большое за ответ!
Поменял php на выполнялку, скомпилленую из С (что и планировал в дальнейшем использовать), но, похоже не в php, а в общих настройках nginx - все-таки я тут что-то делаю не так. Честно говоря, перепробовал уже кучу вариантов, в том числе с https://enable-cors.org/server_nginx.html но пока ничего не помогло |
А страница грузится откуда? С этого же сервера? По https?
|
Спасибо за содействие!
Всяко пробовал, и по https и http с того же сервера ( https://www.elegant-nmr.com/json/ttt.html ) и локально firefox из командной строки пробовал - эффект один и тот же - в логах всегда 405 ошибка. |
405 Method Not Allowed — указанный клиентом метод нельзя применить к текущему ресурсу. В ответе сервер должен указать доступные методы в заголовке Allow, разделив их запятой. Эту ошибку сервер должен возвращать, если метод ему известен, но он не применим именно к указанному в запросе ресурсу,
А что такое json.out? CGI скрипт? Тогда нужно что то в настройках сервера менять. Может он не понимает, что это скрипт и думает, что это простой файл, который нужно передать. Но не запросом POST. Попробуйте GET ему послать. |
По запросу
https://www.elegant-nmr.com/json/json.out в адресной сроке браузера (Это GET) файл просто скачивается (судя по всему программа на С). Если бы в настройках сервера было указано, что это исполнимый скрипт, он бы стал исполняться на сервере. Так по крайней мере в Аппаче. nginx я не знаю. |
Странная проблема с этим nginx.
Похоже он не может запускать CGI скрипты https://coderoad.ru/11667489/%D0%9A%...BD%D0%B0-Nginx |
Спасибо! Да, json.out - это скомпилленный под бубунтой гнутым компилером сишник. Да, верно, скачать его можно, хотя я у него правами доступа уже игрался - не помогало.
То есть в нете есть куча вариантов, как в гребанном NGINX сделать такое, в основном с php (мне именно Сшник скомпилленный нужен), но я ни один пример таки не смог запустить, хотя уже второй день интенсивно пытаюсь. Рут на сервере понятно мой, в бубунте вроде немного разбираюсь (не админ, но многое понимаю) но тут просто какой-то ступор уже. Если кто-то знает что можно попробовать (желательно не отказываясь от nginx) чтобы JSON запрос выполнить на сервере выполнялкой (не через cgi-bin, а именно JSON) пожалуйста, посоветуйте! Спасибо! |
Цитата:
|
Цитата:
https://ru.wikipedia.org/wiki/FastCGI Остается только использовать php (вроде Питон еще есть) |
Есть обертка (скорее прокладка) fcgiwrap.
Это Fast-cgi программа, которая может вызывать cgi скрипты NGINX вызывает ее, передает запрос, fcgiwrap вызывает cgi программу, передает запрос ей, получает ответ, отправляет обратно серверу https://victor-sudakov.livejournal.com/434658.html https://coolchevy.org.ua/2011/11/25/...ort-for-nginx/ https://www.nginx.com/resources/wiki...ples/fcgiwrap/ |
Спасибо большое!
Кажется разобрался, вернее добрый человек помог. Проще было в nginx замапить локальный порт на какой-то адрес, например, с помощью libmicrohttpd, грубо говоря www.mysite.com/device1 линкуется в nginx на 8888 порт и для этого надо в конфиге написать: Код:
location /device1 { |
Часовой пояс GMT +3, время: 22:50. |