Как отправить XML на сервер через HTML-форму?

Мне нужно отправить данные из моей HTML-формы на сервер в формате xml, например:

<some_parameters>
    <firstname>Homer</firstname>
    <lastname>Simpson</lastname>
    <street>74 Evergreen Tr.</street>
</some_parameters>

Все, что я знаю, это то, что это относится к одному из приложений CRM, работающих в другом домене. Теперь я не уверен, что это лучший способ сделать это.

Я думал просто обернуть значения полей в моей форме, когда пользователь отправляет форму. Поэтому, если пользователь набрал «Гомер» в поле «имя» и нажал кнопку «Отправить», мой JS изменит значение поля на <firstname>Homer</firstname>, а затем опубликует данные.

Если это поможет, я использую jQuery на стороне клиента. Я думаю, что должен быть лучший способ, так как мое решение не работает с отключенным JS и кажется немного хитрым, поэтому, если бы вы могли указать мне правильное направление, это было бы здорово.


person spirytus    schedule 18.01.2010    source источник
comment
Чтобы кто-то мог вам помочь, ему нужно знать, что вы используете для своего бэкэнда.   -  person Scott Radcliff    schedule 18.01.2010


Ответы (5)


Лучший способ, который я могу придумать, - это перехватить действие отправки формы и преобразовать данные формы в формат XML, а затем отправить их на сервер. Есть много способов сделать это, но проще всего реализовать решение с помощью фреймворка, такого как jQuery:

Пример этой самой вещи можно найти в Интернете по адресу https://web.archive.org/web/20160305210731/http://www.docunext.com/blog/2009/01/convert-form-data-to-xml-with-jquery.html, который использует Плагин JSON для XML:

$("#myform").submit(function(){
  var formjson = $('#myform').serializeArray();
  var formxml = json2xml(formjson);
  $.post("/collect.php", { 'data': formxml }, function(data){ 
    // callback logic
  });
  return false;
});
person Sampson    schedule 18.01.2010
comment
Обе ссылки битые! - person thomaskonrad; 05.01.2017
comment
@thomaskonrad Я исправил ссылки (путем перенаправления на архивы на обратном пути). Вероятно, некоторые загрузки и другие ресурсы могут не работать. Дайте мне знать, если у вас возникнут дополнительные проблемы. - person Sampson; 07.01.2017

Публикация XML без javascript или плагинов для браузера невозможна. Два возможных формата размещения html-форм: application/x-www-form-urlencoded и multipart/form-data.

person Darin Dimitrov    schedule 18.01.2010
comment
Вы имеете в виду возможно вместо невозможного? - person MaxZoom; 11.12.2017

Я только что заставил это работать в хроме, у ключа есть пустое место в имени текстовой области:

<html>
    <body>
        <form action="http://target_webservice" method="post">
            <textarea rows="20" cols="100" name=" ">
                <?xml version="1.0"?><requestElements><blah></blah></requestElements>
            </textarea>
            <input type="submit" value="Submit">
        </form>        
    </body>
</html> 
person user2700463    schedule 20.08.2013
comment
Это все еще публикуется как application/x-www-form-urlencoded - person Dave Sims; 01.06.2018

Вы можете отправить XML, используя XFORMS. Например, см.: http://www.mozilla.org/projects/xforms/

person Pierre    schedule 18.01.2010
comment
+1, но, насколько мне известно, это не поддерживается в большинстве браузеров. - person the_drow; 18.01.2010
comment
Устарело с Gecko 19 (Firefox 19 / Thunderbird 19 / SeaMonkey 2.16) - person Nicholas TJ; 11.09.2013

Если код на стороне сервера является опцией, вы можете использовать собственный скрипт php CURL в качестве посредника для пересылки вашего запроса третьей стороне в реальном формате xml. Я не уверен, что CURL поставляется со стандартной установкой php, и если это не вариант, вы, вероятно, могли бы вместо этого использовать fsocketopen (хотя лично я думаю, что эта тактика сложнее). Но CURL достаточно прост в установке и чрезвычайно полезен, поскольку позволяет php отправлять запросы, как если бы это был браузер. Разница, которая может вас здесь заинтересовать, заключается в том, что она действительно позволяет вам установить заголовок «Тип контента: текст/xml».

Итак, ваша html-форма отправляет некоторые обычные значения GET или POST в ваш php-скрипт. Затем этот личный php-скрипт преобразует их в формат XML, который ожидает третья сторона. (Не забудьте поставить перед ним тег <?xml version="1.0" encoding="ISO-8859-1"?> с любыми значениями атрибутов, которые вам подходят.) А затем отправьте его с помощью этого кода:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-type: text/xml', 
    'Content-length: '.strlen($xmlRequest),
));
$output = curl_exec($ch);
curl_close($ch);
person kmuenkel    schedule 02.06.2015