如何通过 HTML 表单将 XML 发布到服务器?

Posted

技术标签:

【中文标题】如何通过 HTML 表单将 XML 发布到服务器?【英文标题】:How to post XML to server thru HTML form? 【发布时间】:2011-01-06 12:40:04 【问题描述】:

我必须以 xml 格式将数据从我的 html 表单发布到服务器,例如:

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

我所知道的是它用于在不同域上运行的 CRM 应用程序之一。现在我不确定什么是最好的方法。

当用户提交表单时,我只想在表单中包装字段的值。因此,如果用户在“名字”字段中键入“Homer”并单击提交,我的 JS 会将字段的值更改为&lt;firstname&gt;Homer&lt;/firstname&gt;,然后发布数据。

如果有帮助,我将在客户端使用 jQuery。我认为必须有更好的方法,因为我的解决方案会在禁用 JS 的情况下中断,而且看起来有点狡猾,所以如果你能指出我正确的方向,那就太棒了。

【问题讨论】:

为了有人帮助您,他们需要知道您在后端使用什么。 【参考方案1】:

在没有 javascript 或浏览器插件的情况下发布 XML 是不可能的。发布 html 表单的两种可能格式是 application/x-www-form-urlencodedmultipart/form-data

【讨论】:

您的意思是 可能 代替不可能吗?【参考方案2】:

我刚刚让它在 chrome 中工作,关键是文本区域名称中有空格:

<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> 

【讨论】:

那仍然发布为 application/x-www-form-urlencoded【参考方案3】:

我能想到的最好的方法是拦截表单提交动作,并将表单详细信息转换为 XML 格式,然后将其提交给服务器。有很多方法可以做到这一点,但最简单的方法是通过像 jQuery 这样的框架来实现解决方案:

可以在http://www.docunext.com/...data-to-xml-with-jquery 在线找到这方面的一个示例,它使用了JSON to XML Plugin:

$("#myform").submit(function()
  var formjson = $('#myform').serializeArray();
  var formxml = json2xml(formjson);
  $.post("/collect.php",  'data': formxml , function(data) 
    // callback logic
  );
  return false;
);

【讨论】:

两个链接都失效了! @thomaskonrad 我已经修复了链接(通过在返回时重定向到档案)。可能某些下载和其他资源可能无法正常工作。如果您遇到任何其他问题,请告诉我。【参考方案4】:

您可以使用XFORMS 发送 XML。例如见:http://www.mozilla.org/projects/xforms/

【讨论】:

+1 但据我所知,大多数浏览器都不支持此功能。 自 Gecko 19 (Firefox 19 / Thunderbird 19 / SeaMonkey 2.16) 起已过时【参考方案5】:

如果服务器端代码是一个选项,您可以使用自定义 php CURL 脚本作为中间人,以实际 xml 格式将您的请求转发给第三方。我不确定 CURL 是否带有标准的 php 安装, 如果它不是一个选项,你可能会使用 fsocketopen 代替(虽然我个人认为这种策略更难)。但是 CURL 很容易安装,并且对于基本上允许 php 像浏览器一样发送请求非常有用。您可能在这里感兴趣的区别在于,它实际上允许您设置标题“Content-type: text/xml”。

所以让你的 html 表单发送一些常规的 GET 或 POST 值到你的 php 脚本。然后让该个人 php 脚本将它们转换为第 3 方期望的 XML 格式。 (不要忘记在它前面加上 &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; 标记,使用适合您的任何属性值。)然后通过以下代码将其发送出去:

$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);

【讨论】:

以上是关于如何通过 HTML 表单将 XML 发布到服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 ajax 调用将 html 表单数据发送到 node.js 服务器?

使用 xml 将 javascript 变量发布到服务器

将 HTML 表单数据保存为 XML

通过 XML HTTP 请求发布发送密码(启用 HTTPS)

如何使用 JSON/XML 将数据传递到使用 Selenium WebDriver 的表单

将组件添加到表单时如何自动添加 Delphi 单元? [复制]