如何使用GET方法通过XMLHttpRequest传递FormData

时间:2016-03-09 21:08:05

标签: javascript html ajax forms

senderform的方法是POST时,一切正常。但是,只要我将方法更改为GET,我就不会在服务器上收到任何内容。

function ajaxSubmit(destinationElement, senderform) {

    var xmlreq = new XMLHttpRequest();
    var params = new FormData(senderform);
    xmlreq.open(senderform.method, senderform.action, true);

    if (/\/content\.php$/.test(senderform.action))
        xmlreq.onreadystatechange = receiveTable;
    else xmlreq.onreadystatechange = receiveText;

    xmlreq.send(params);
}

我知道我可以在Action地址的末尾manually append key-value pairs,但问题是我不知道哪个表单将通过哪些字段传递。

如果可能,我更喜欢原生的javaScript。

如何使用带有来自senderform的键值对的XMLHttpRequest发送GET请求,这些键值对指向Element(与POST请求的工作方式相同)?

3 个答案:

答案 0 :(得分:2)

最后,我提供了此解决方案,该解决方案从senderform表单引用中加载所有键值对。

function ajaxSubmit(destinationElement, senderform) {
var xmlreq = new XMLHttpRequest();
var params = new FormData(senderform);

if (senderform.method == 'get')
{
    var firstRun = true;
    for (var key of params.keys())
    {
        if (firstRun)
        {
            senderform.action += '?';
            firstRun = false;
        }
        else senderform.action += '&';
      senderform.action += key + "=" + params.get(key);
    }
}
xmlreq.open(senderform.method, senderform.action, true);
if (senderform.action.indexOf('content.php')!==-1)
    xmlreq.onreadystatechange = receiveTable;
else xmlreq.onreadystatechange = receiveText;
xmlreq.send(params);
}

结合@ tanc的答案和this article我能够解决我的问题。

答案 1 :(得分:1)

您确定问题不是PHP脚本吗?我没有看到https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#send()与FormData需要POST工作的参考,但如果PHP脚本从$ POST或其他东西(我的PHP生锈)中获取信息,则行为会有所不同。

答案 2 :(得分:0)

由于您无法在GET请求中创建可用的正文(请参阅下文),因此另一个选项是在网址中使用params。



function buildGetUrlParams(baseUrl, paramsObj) {
  var builtUrl = baseUrl + "?";
  Object.keys(paramsObj).forEach(function(key) {
    builtUrl += key + "=" + paramsObj[key] + "&";
  });
  return builtUrl.substr(0, builtUrl.length - 1);
}

document.getElementById('finalUrl').innerText = buildGetUrlParams('http://test.url.com', { name:'James', occupation:'web design' });

<div id="finalUrl"></div>
&#13;
&#13;
&#13;

HTTP GET请求可以包含正文,但该正文没有语义含义。简单来说,这意味着服务器没有任何理由,也不知道如何处理GET请求的主体。如果可以编写可以执行此操作的服务器,那么根据HTTP/1.1规范,这将是不好的做法:

  

如果请求方法不包含实体主体的定义语义,则在处理请求时应该忽略消息体。

这基本上就是它无法正常工作的原因。如果要发送服务器能够响应的任何类型的数据,那么您需要使用不同的HTTP方法。

This answer也解释了这个问题。