Выход из амперсанда программно в xml вроде не работает. Полезная нагрузка отключается - PullRequest
1 голос
/ 07 апреля 2020

У меня есть плата Arduino, с которой я пытаюсь отправить xml данные на сервер. У меня проблемы с & in xml, поэтому сначала я протестировал браузер. Я создаю форму html, отправляю данные, собираю заголовки на сервере и пытаюсь скопировать ее на плату.

html форма.

<form id= "pData" action="#" method="post" > 
    <textarea  name="postData" ></textarea>
    <input type='submit' value=' Go '/> 
</form>

Получение данных из php сервер

if(isset($_POST['postData'])){
    $input_headers="";
    $file = 'xmlErrors.txt';
    foreach ($_SERVER as $name => $value) {
        $input_headers.= "$name: $value\n";
    }

    $settings=$input_headers."\r\n".$_POST['postData'];
    file_put_contents($file,$settings, FILE_APPEND );
}

Вот как я отправляю его с доски. И я печатаю данные на последовательном мониторе, чтобы убедиться, что они хорошо выглядят.

String request = "POST /test.php HTTP/1.1\r\nHost: example.com\r\nAccept-Encoding: gzip, deflate \r\nCache-Control:max-age=0\r\nUser-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nAccept-Language:en-US,en;q=0.9,pl;q=0.8\r\nReferer:example.com\r\nContent-Type: application/x-www-form-urlencoded\r\n";
String payload = "<?xml version='1.0' encoding='UTF-8'?><response>a=1&amp;b=2</response>";
//Serial.print("length: ");Serial.println(payload.length());
request += "Content-Length:" + String(payload.length() + 15) + "\r\nConnection: Close\r\n\r\postData=" + payload;
client.print(request);

Когда я проверяю их из браузера, данные записываются правильно. Но когда я отправляю его с доски, он обрывается на

<?xml version='1.0' encoding='UTF-8'?><response>a=1

Я пытался изменить полезную нагрузку данных, как

<?xml version='1.0' encoding='UTF-8'?><response>a=1&#038;b=2</response>

Независимо от того, что я пытаюсь, он просто обрезается , И я сопоставил почти все http-заголовки, которые имели для меня смысл с доски, но безрезультатно. Без & я получаю все данные на сервере с платы, поэтому я считаю, что остальная часть кода на плате выполняет свою работу.

Есть какие-нибудь подсказки?

1 Ответ

0 голосов
/ 07 апреля 2020

Для тех, кто удаленно попадает в этот угол проблем, вот что произошло.

Веб-браузер отправляет данные с

CONTENT_TYPE: application/x-www-form-urlencoded

Это означает, что он превращается в% 26 и вот как это проходит. На плате, хотя заголовок присутствует, и он не закодирован, скорее xml сбежал. Если вы измените & на% 26, вы пройдете через часть $ _POST. После того, как вы получите данные, вы должны xml экранировать ваш & с &amp;, чтобы он прошел xml синтаксический анализ.

Благодаря Wireshark:)

...