javascript - 使用 javascript 将 xml 作为二进制文件发布

标签 javascript xml ajax yui

我正在尝试编写一些可以将 xml 作为二进制文件发布到 JavaScript 中的外部 URL(我无法控制)的东西。 我有 YUI3 可用。如果我需要的话,可能还有 jQuery。

有什么想法吗?我看过的所有内容似乎都是关于接收 xml,而不是发布它。

编辑:外部网址是一个广告机器人,XML 本质上描述了我想要返回的广告类型。

我被迫以二进制形式发布。我已经测试过使用-

<form enctype="multipart/form-data" action="http://something.com" method="post">
<input name="anything" type="file">something</file>
<input type="submit">
</form>

这样就可以了。我只需要在js中实现即可。 编辑#2

我的解决方案(无法正确格式化)-

var AdManager = { 获取随机边界:函数(){ var 今天 = 新日期; 返回“---”+today.getTime(); }, 获取:函数(){ var 边界 = this.getRandomBoundary(); var xhr = 新的 XMLHttpRequest; var CRLF = "\r\n";

    xhr.open('POST', 'http://url.com', true);
    xhr.onreadystatechange = function(){
        if (xhr.readyState === 4)
        {
            //Parse xml(badly)
            var splitter = xhr.responseText.split('<responsecontent>');
            var allAds = '';
            for (var i= 1; i< splitter.length; i++)
            {
                var tempAd = splitter[i].split('</responsecontent>');
                allAds += tempAd[0];
            }
            //Html is returned encoded, so decode.
            jQuery('#results').html(jQuery("<div/>").html(allAds).text());
        }
    };

    xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

    var mimeReq = "--" + boundary + CRLF;
    mimeReq += 'Content-Disposition: form-data; name="arbitrary"; filename="arbitrary.xml"' + CRLF;
    mimeReq += 'Content-Type: application/octet-stream' + CRLF + CRLF;
    mimeReq += '<?xml version=\"1.0\" encoding=\"utf-8\"?><adrequestpacket responsemarkup=\"wml\" test=\"0\" xmlns=...'+ CRLF;
    mimeReq += "--" + boundary + "--" + CRLF;

    xhr.send(mimeReq);
}

}; `

最佳答案

我想我明白你的要求,但如果我完全走错了路,下面的内容可能会显得有点居高临下,所以提前道歉......

如果您想要做的只是通过 AJAX 将 XML 文件发送到已知的 URL,那么它在 javascript 中相当简单,没有 jQuery 等可爱功能。我假设您已经生成了 XML 文件并将其作为字符串变量存储在某处.

下面的代码有点困惑并且相当基础,但希望它能为您指明正确的方向。如果您搜索的话,可能有更好的方法来获取 AJAX 对象,但这是我多年来使用的方法,从来没有真正遇到过任何问题。

您将需要编写一些代码来解析服务器响应,以确定数据是否被接受 - 请参阅代码中的注释以了解您将在哪里执行此操作。 ajaxObj.statusajaxObj.responseText 属性将是您的 friend 。

function postXMLToServer (serverURL, xmlStr) {

  // Declare some variables
  var activeXModes, i, ajaxObj, aSync, contentType;

  // Set this to false to perform the request synchronously (i.e. execution will block until request has completed)
  aSync = true;

  // 'application/octet-stream' is treated as raw binary data by any sensible server.
  // It might make more sense to use 'text/xml' or some variant depending on your application
  contentType = 'application/octet-stream';

  // Fetch an AJAX object
  activeXModes = ["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];
  if (window.ActiveXObject) { // Try ActiveX (for IE)
    for (i = 0; i < activeXModes.length; i++) {
      try {
        ajaxObj = new ActiveXObject(activeXModes[i]);
      } catch (e) {}
    }
  } else if (window.XMLHttpRequest) { // For Mozilla, Safari etc
    ajaxObj = new XMLHttpRequest();
  } else { // No AJAX
    alert('AJAX is not supported in your browser');
    return;
  }

  // Open connection to server
  ajaxObj.open('POST',serverURL,aSync);

  // Set some request headers - you might be able to get away with not doing this, but it
  // should be considered good practice, especially when doing POST requests
  ajaxObj.setRequestHeader('Content-Type',contentType);
  ajaxObj.setRequestHeader('Content-Length',xmlStr.length);

  // Set a callback for asynchronous requests (not called if aSync = false)
  ajaxObj.onreadystatechange = function () {
    if (ajaxObj.readyState == 4) {

      // parse the server response here

    }
  };

  // Send the request
  ajaxObj.send(xmlStr);

  // if aSync = false, parse the server response here

}

// Example of how to use the function
var myXMLStr = '<?xml version="1.0" encoding="iso-8859-1" ?>\n<toplevel>\n<lowerlevel anattribute="a value">An inner value</lowerlevel>\n</toplevel>';
var myURL = 'http://sub.domain.tld/path/to/document.ext?getparameter=somevalue';

postXMLToServer(myURL,myXMLStr);

关于javascript - 使用 javascript 将 xml 作为二进制文件发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7039350/

相关文章:

javascript - 如何在 select2 中使用选项组或按索引选择选项

javascript - jQuery `on` 方法未绑定(bind)事件

c# - app.config 中的嵌套自定义元素 (C#)

xml - ClassNotFoundException : org. apache.xml.serializer.TreeWalker

php - 完成后使用 jQuery 向 iframe 反馈提交表单?

javascript - 向 AngularJS 中的指令提供远程数据

javascript - 如何在新选项卡中打开 html 的特定部分?

javascript - 使用正则表达式验证我们的号码

android - 更改初始屏幕图层列表中位图的大小

javascript - 在 Yii 中启用客户端验证和提交表单后添加了双记录