ethernet shild w5100 символ # в GET запросе
- Войдите на сайт для отправки комментариев
Всем привет.
Впервые решил задать вопрос т.к. два дня гугления, яндексения а также прочие методы научного тыка результата не дали. Правда, вопрос скорее всего не к ардуине, но мало ли, может кто сталкивался с подобным :) У меня фантазия закончилась в какую сторону копать...
Есть arduino mega с ethernet shild w5100, одна из задач которой через RF wireless раздавать получаемые по ethernet команды другим устройствам. Вся логика закладывается в скриптах web интерфейса - ардуина в этой части работает только как интерпретатор/ретранслятор. В какойто момент надоело при каждом изменении html страничек бегать и вручную записывать их на SD карту, потому наваял их перезапись тоже через web интерфейс. И все отлично работало до того момента как я не решил обновить один из css файлов, в котором встретился символ #
Это все была лирика, теперь сама проблема: почему как только в тексте GET запроса встречается символ # - на этом запрос и заканчивается?
Пример html с запросом:
<!DOCTYPE html> <html> <head> <title>Arduino</title> <script> function SendRequest(){ zapros="a a#bb" nocache = "&=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function(){ if (this.readyState == 4) { if (this.status == 200) { if (this.responseText == 'ok') { return true; }else{ return false; } } } } request.open("get", '*'+zapros+ nocache, false); request.send(null); } </script> </head> <body> <button onclick="SendRequest()">Send</button> </body> </html>
лог полученного запроса на ардуино сервере:
GET /*a%20a HTTP/1.1 Host: 192.168.0.177 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 Accept-Encoding: gzip, deflate, sdch ;q=0.8,en-US;q=0.6,en;q=0.4
Отвечаю сам - как часто бывает, ответ нашелся сразу после того как отчаялся уже разобраться. При использовании функции encodeURIComponent(zapros) перед отправкой строки, строка кодируется как надо. Остался открытым вопрос: почему поумолчанию все кодируется, кроме этого символа...
PS Можно удалить тему, т.к. к ардуино ни какого отношения проблема не имеет.
Почитайте про обработку URL браузерами - '#' это специальный символ для ссылки внутри страницы без запроса на сервер - называется "якорь" - поэтому все что после будет отбрасываться. лучше использовать другой символ как разделитель.
Почитайте про обработку URL браузерами - '#' это специальный символ для ссылки внутри страницы без запроса на сервер - называется "якорь" - поэтому все что после будет отбрасываться.
Спасиб :) именно чтение этого + фраза из описания работы с ajax запросами (про то, что заботиться о URL кодировке надо самим) и сложило этот пазл.
В моем случае это не применимо, т.к. в запросе через URL передается содержимое файла (html,css,js), соответственно должны поддерживаться все символы.
Ну может тогда POST запросом,а не GET...
Ну может тогда POST запросом,а не GET...
Изначально писалось под UNO, нужно было экономить на всем. От обработки POST пришлось отказаться. А сейчас.. по принципу "работает - ну и не трож" :)
Не очень в этом разбираюсь, но по-моему "недопустимые" символы в строке запроса кодируются последовательностью из нескольких допустимых. По-моему, символом "%" и шестнадцатеричным кодом. Но могу наврать, лучше уточните у специалистов или у гугла.
да все уже :) Проблема в моем случае решена, решение в посте №2 :)
Если кому поможет, то да, действительно все "недопустимые" сиволы в URL кодируются в формат %XX или %uXXXX (для unicode), где XX число в шеснадцатеричном коде. Что я и писал в своем вопросе:
По идее # должен был перекодироваться в %23 и результат должен быть таким:
потому, при отправке таких специфических GET запросов, необходимо перекодировать его URL формат до отправки зароса. Функция encodeURIComponent() в моем случае решила проблему (правда, насколько я успел почитать, она не для всех браузеров корректно отрабатывает).
Кроме того, есть еще ряд значений строки (и всесьма обширный), которые браузер поумолчанию не кодирует (например, такие как '/t' '/n'). В моем случае, т.к. для html они не важны, я их отбрасывал в самом скрипте, для уменьшения запроса, потому столкнулся с этой проблемой только когда попался символ '#'