ajax не видит ответа (http_request.status==0)

Тема в разделе "Arduino & Shields", создана пользователем djdance, 28 июл 2012.

  1. djdance

    djdance Нерд

    не могу подружить ПК с ардуино через аякс.
    отправляю с ПК асинхронный запрос традиционно:

    Код (Text):
    http_request.onreadystatechange = function() { alertContents(http_request,from); };
    var reqs="http://192.168.7.177?a0="+a0+"&a1="+a1+"&a2="+a2;
    http_request.open('GET', reqs, true);
    http_request.send();
     
    function alertContents(http_request,from){  
    if (http_request.readyState == 4) { //ждем
      if (http_request.status == 200) { //все ок
        //тут реакция
      }
    }
    так вот, http_request.readyState благополучно пробегает 1,2 и 4
    а вот http_request.status всегда нулевой. И полный текст http_request тоже пустой.

    на самом ардуино тоже традиционно:
    Код (Text):
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    //блабла отправляем еще что-то
    если открыть ардуино через браузер напрямую, - все работает, все стреляет, команд выполняются, то есть println отрабатывает, поскольку команды мотору идут сразу после.
    а аякс ничего не видит. Что не так?
     
  2. djdance

    djdance Нерд

    Копаю, кажется понял.

    Запрет на кроссдоменные запросы, ведь ПК и арудино на разных IP. Но удивительны две вещи.
    1. Команды серверу на ардуино проходят!
    2. IE получает ответ 200 OK, мозилла и опера - нет.

    а может, дело не в этом?
     
  3. nailxx

    nailxx Официальный Нерд Администратор

    Да, дело в кросс-доменных запросах. И дело в том, что это защита не сервера, а защита клиента, то есть браузера. Поэтому по факту сервер запрос отрабатывает, а браузер ответ зарезает. Решений несколько:
    1. Old school. Проксировать запрос через свой сервер. То есть: AJAX-запрос идёт на ваш сервер на том же домене, сервер переправляет его стороннему домену и прокидывает ответ обратно
    2. Hack. Использовать JSONP.
    3. New school. Возвращать в заголовках HTTP-ответа с Arduino директиву: Access-Control-Allow-Origin: * Это инструкция для браузера, что тут кросс-доменный запрос позволяется. Правильно понимают этот хеадер Mozilla и Chrome — давно, Opera начиная с версии 12, IE не помню, вроде бы с 8-й версии.
     
  4. djdance

    djdance Нерд

    оч полезно, благодарю