如何在包含非字母数字字符的ajax中正确设置请求标头?

时间:2014-05-01 16:15:31

标签: ajax encoding request

我的HTML文件包含一个只有textarea的表单,其内容被发送到java servlet(称为“编译器”)。 textarea文本将始终是java代码,因此它可能包含+,%,=等字​​符。 我正在使用ajax来获取并显示来自servlet的响应。 但是使用ajax会破坏表单发送的整个数据,因为它会删除部分文本或者完全忽略我上面提到的字符。

这是我的html文件:

<html>
<head>

<script type="text/javascript">

function objetoAjax(){
    http_request= false;
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
           http_request.overrideMimeType('text/xml');
        }
     } else if (window.ActiveXObject) { // IE
        try {
           http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
           try {
              http_request = new ActiveXObject("Microsoft.XMLHTTP");
           } catch (e) {}
        }
    }
    return http_request;
}

function devolver_resultado(){
    var llamadaAjax = objetoAjax();
    var codigo = document.getElementById('codigo').value;
    llamadaAjax.open("POST",'Compiler',true);
    llamadaAjax.onreadystatechange = function() {
        if(llamadaAjax.readyState == 4){
            document.getElementById("resultado").innerHTML = llamadaAjax.responseText;
        }
    };
    llamadaAjax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    llamadaAjax.send('codigo='+codigo);
}

</script>
</head>

<body>

<form action="Compiler" method="post">
    <textarea rows="18" cols="70" id="codigo" name="codigo"></textarea>
    <input type="submit" value="Compile" onclick="devolver_resultado(); return false;">
</form>

<div id="resultado">
</div>

</body>
</html>

我调试了javascript以查看问题是否是我将textarea值分配给“codigo”变量的地方: var codigo = document.getElementById('codigo')。value; screenshot

但是这个变量正在被正确设置,所以我怀疑请求被错误编码(screenshot)。 我是ajax的新手,但我认为这是由 llamadaAjax.setRequestHeader(“Content-Type”,“application / x-www-form-urlencoded”)控制的;

From this page我知道我应该将表单编码为multipart / form-data。我尝试将编码类型添加到表单中: 但这没有帮助。

所以,这里有两个问题:

1)实际上这条线是错误的吗?的 llamadaAjax.setRequestHeader( “内容类型”, “应用程序/ x WWW的形式进行了urlencoded”) 如果是这样,我该如何解决?

2)如果那不是bug的地方,还有什么可能发生? (记住,删除所有的ajax并保留一个调用我的“编译器”servlet的普通表单按预期工作,因此servlet没有错误)。

谢谢!

1 个答案:

答案 0 :(得分:0)

解决。

我需要的只是在发送之前对文本进行编码:

llamadaAjax.send('codigo='+encodeURIComponent(codigo));