我试图从Javascript应用程序调用Hessian Web服务,但是我在解析响应时遇到问题,因为jQuery将响应视为文本并剥离它的第一个字节。 在我的研究中,我发现你需要将字符集设置为' charset = x-user-defined' ,以便浏览器按原样保留我的字节。但是,根据ajax文档:
将数据发送到服务器
默认情况下,使用GET HTTP方法发送Ajax请求。如果 需要POST方法,可以通过设置a来指定方法 type选项的值。此选项会影响内容的方式 数据选项被发送到服务器。 POST数据永远是 根据W3C,使用UTF-8字符集传输到服务器 XMLHTTPRequest标准。
事实上,无论我使用何种设置,字符集都不会改变。我已经分别尝试了以下内容,并且没有运气
$.ajax({
type : 'POST',
url : url,
timeout : 3000,
data : parameters,
contentType : "x-application/hessian; charset=x-user-defined'",
mimeType: 'text/plain; charset=x-user-defined',
headers: {
Accept : "text/plain; charset=x-user-defined",
"Content-Type": "text/plain; charset=x-user-defined"
},
beforeSend : function(xhr) {
xhr.overrideMimeType("text/plain; charset=x-user-defined");
}
})
此外,我试图搞乱jQuery中定义的数据转换器和自定义内容类型,但没有成功。
根据标准,我似乎无法做到这一点。它适用于GET但不适用于POST,而Hessian协议则需要POST。
你有什么想法吗?或者我是否需要从头开始构建我的XHR方法?
答案 0 :(得分:1)
事实证明我在其他地方犯了一个愚蠢的错误。但无论如何,我找到了一种处理请求和响应二进制数据的方法,from here。
define(function() {
// Do setup work here
function configurationException(message) {
throw new Error(message + " missing from configuration object");
}
return {
post : function(config) {
if (config) {
var url = config.url || configurationException("url");
var done = config.done || configurationException("callback function");
var timeout = config.timeout || 10000;
var data;
if (config.data) {
data = config.data;
} else {
data = null;
console.warn('No data is specified in binaryPost');
}
var request = new XMLHttpRequest();
request.open("POST", url, true);
request.responseType = "arraybuffer";
request.setRequestHeader("Content-Type", "x-application/hessian;");
request.onload = function(oEvent) {
var arrayBuffer = request.response; // Note: not oReq.responseText
if (arrayBuffer) {
var byteArray = new Uint8Array(arrayBuffer);
done(byteArray);
}
};
request.send(data);
} else {
throw new Error("Configuration object is missing");
}
}
};
});
希望你觉得它很有用