0

我正在尝试从 Javascript 应用程序调用 Hessian Web 服务,但在解析响应时遇到问题,因为 jQuery 将响应视为文本并剥离它的第一个字节。在我的研究中,我发现您需要将字符集设置为'charset=x-user-defined'以便浏览器保留我的字节。但是,根据 ajax 文档:

向服务器发送数据

默认情况下,Ajax 请求使用 GET HTTP 方法发送。如果需要 POST 方法,可以通过设置 type 选项的值来指定该方法。此选项影响数据选项的内容如何发送到服务器。根据 W3C XMLHTTPRequest 标准,POST 数据将始终使用 UTF-8 字符集传输到服务器。

事实上,无论我使用什么设置,字符集都不会改变。我已经分别尝试了以下所有方法,但没有成功

$.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 方法?

4

1 回答 1

1

原来我在其他地方犯了一个愚蠢的错误。但无论如何,我从这里找到了一种处理请求和响应二进制数据的好方法。

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");
        }
    }
};
});

希望你觉得它有用

于 2013-05-23T01:47:57.697 回答