我正在尝试编写可以将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 = {
getRandomBoundary : function(){
var today = new Date;
return '---' + today.getTime();
},
fetch : function(){
var boundary = this.getRandomBoundary();
var xhr = new 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);
}
}; `
答案 0 :(得分:2)
我想我理解你的要求,但如果我完全走错了路,下面可能会显得有点光顾,所以提前道歉......
如果你想要做的就是通过AJAX将XML文件发送到已知的URL,它在javascript中相当简单,没有像jQuery等可爱的东西。我假设你已经生成了XML文件并将其存储为某处的字符串变量
以下代码有点混乱且相当基本,但希望它应该指向正确的方向。如果您搜索它们,可能有更好的方法来获取AJAX对象,但这是我已经使用了很长时间并且从未真正遇到任何问题的方法。
您需要编写一些代码来解析服务器响应以确定数据是否被接受 - 请参阅代码中的注释,了解您将在何处执行此操作。 ajaxObj.status
和ajaxObj.responseText
属性将成为您的朋友。
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);
答案 1 :(得分:0)
你想要的并不完全清楚。计算机中的一切以二进制表示。因此,当您将XML文档发布到http://something.com
时,它就是正在传输的XML文件中字符的二进制表示。