26.11.2021, 11:16
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
Сообщение от ksa
|
Так ты как-то открываешь сокет... Потом отправляешь запрос... После получения ответа сокет закрываешь.
Так?
|
я думал, что сокет открывается при обращении к серверу, по крайней мере у меня оно так работает)
повторяю, я "создал" сервер программой hercules_3-2-8 и вижу что на него приходит.
приходит пакет с заголовком, потом я хочу сервером отправить ответ, но колбек в программе не срабатывает.
есть мнение, что после отправки пакета сокет закрывается.
потому и прошу показать фрагмент кода, который ПРАВИЛЬНО делает запрос и получает ответ.
|
|
26.11.2021, 11:36
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,118
|
|
Сообщение от s868
|
я думал, что сокет открывается при обращении к серверу
|
Если ты получил ответ на клиенте - сервер про тебя уже знать не знает...
Сообщение от s868
|
потому и прошу показать фрагмент кода, который ПРАВИЛЬНО делает запрос и получает ответ.
|
Так в самой документации этих примеров достаточно...
Вот хоть такой
<!DOCTYPE html>
<html>
<head>
<title>Использование функции $.ajax()</title>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script>
$( document ).ready(function(){
$( "button" ).click(function(){ // задаем функцию при нажатиии на элемент <button>
$.ajax({
method: "POST", // метод HTTP, используемый для запроса
url: "about.php", // строка, содержащая URL адрес, на который отправляется запрос
data: { // данные, которые будут отправлены на сервер
name: "Denis",
city: "Erebor"
},
success: [function ( msg ) { // функции обратного вызова, которые вызываются если AJAX запрос выполнится успешно (если несколько функций, то необходимо помещать их в массив)
$( "p" ).text( "User saved: " + msg ); // добавляем текстовую информацию и данные возвращенные с сервера
},
function () { // вызов второй функции из массива
console.log( "next function" );
}],
statusCode: {
200: function () { // выполнить функцию если код ответа HTTP 200
console.log( "Ok" );
}
}
})
});
});
</script>
</head>
<body>
<button>Клик</button>
<p></p>
</body>
</html>
|
|
26.11.2021, 12:15
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
скопировал фрагмент кода в пустой файл, в урл установил google.com, убрал отправку данных, изменил колбек на window.alert("Hello world!");
запустил файл, нажал на кнопку.
(предварительно открыл консоль разработчика в браузере хром)
вижу,что запрос на гугл произошел, ответ получен
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
Date: Fri, 26 Nov 2021 09:20:22 GMT
Content-Type: text/html; charset=UTF-8
Server: gws
Content-Length: 1589
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
колбек функция window.alert("Hello world!");
не сработала, данные на экране не появились.
что делаю неправильно?
|
|
26.11.2021, 12:16
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
где эти Content-Length: 1589???
они же пришли от гугла
|
|
26.11.2021, 12:45
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,692
|
|
Сообщение от s868
|
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
|
Вот на это внимание надо обращать.
Ну и к тому же не каждый сервер позволит обращаться к себе скриптам.
Та в заголовках надо устанавливать правильны user-agent + проблемы cors...
Последний раз редактировалось voraa, 26.11.2021 в 12:48.
|
|
26.11.2021, 13:12
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,692
|
|
Вообще обращаться к серверу на другом домене (другой ip, другой порт, другой протокол) через $.ajax или fetch - тот еще геморой.
К тому же вы, похоже, просто вызываете страницу с диска, а не получаете с какого то сервера. (там где то в заголовке Origin: null был) Этот фокус вообще не пройдет.
Что бы страница (она должна быть получена не из файла, а с какого то сервера) хочет получить данные с другого сервера, через $.ajax или fetch, то тот другой сервер должен посылать в ответ правильные заголовки, связанные с cors. Иначе браузер просто не пропустит его ответы. Но и вы должны правильно настроить заголовки в запросе.
|
|
26.11.2021, 13:25
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
эхх((
именно страница (нтмл-файл) находится на диске.
если ее разместить на каком-то хостинге - проблема решится?
|
|
26.11.2021, 13:52
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,692
|
|
Смотря какая проблема.
(Проще у себя на компе поднять сервер - хоть апач, хоть иис)
Но не всякая проблема решится.
Что бы браузер пропустил ответ от стороннего сервера на запрос от $.ajax или fetch, этот сервер должен присылать соответствующие заголовки. Например
strict-origin-when-cross-origin
google.com такого заголовка не посылает - поэтому браузер блокирует ответ.(Ответ то приходит, но браузер его не дает посмотреть.)
Я уже писал, что это геморой обращаться к произвольному серверу из скриптов в браузере.
Проще делать так - писать на своем сервере скрипт, который будет обращаться к другим серверам и пересылать ответ уже странице. Серверные скрипты все эти проблемы с cors не волнуют. Это чисто браузерная заморочка.
|
|
26.11.2021, 13:59
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
сервер, ответ от которого не воспринимается, сделан на микроконтроллере, влеплю любой заголовок, в данный момент шлет
"HTTP/1.1 200 OK\r\n";
"Content-Type: text/html; charset=UTF-8\r\n";
"Content-Length: 800\r\n\r\n";
....................................
что надо добавить в заголовок, чтоб ответ был воспринят js?
|
|
26.11.2021, 15:07
|
Интересующийся
|
|
Регистрация: 18.11.2021
Сообщений: 18
|
|
все, спасибо, разобрался:
char htmld0[]="HTTP/1.1 200 OK\r\n";
char htmld1[]="Content-Type: text/html; charset=UTF-8\r\n";
char htmld2[]="Access-Control-Allow-Origin: *\r\n";
char htmld3[]="Content-Length: 12\r\n\r\n";
char htmld4[]= "123456789abc";
колбэк вызывается, принятые данные 123456789abc
всем спасибо!
|
|
|
|