在jQuery Ajax Post上强制“charset = x-user-defined”

时间:2013-05-22 22:42:42

标签: javascript jquery ajax character-encoding hessian

我试图从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方法?

1 个答案:

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

希望你觉得它很有用