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

Posted

技术标签:

【中文标题】如何使用 GET 方法通过 XMLHttpRequest 传递 FormData【英文标题】:How to pass FormData over XMLHttpRequest using GET method 【发布时间】:2016-06-24 11:31:48 【问题描述】:

senderform 的 Method 为 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

如何使用 XMLHttpRequest 发送一个 GET 请求,该请求带有来自 senderform 的键值对,它指向表单元素(与它已经用于 POST 请求的方式相同)?

【问题讨论】:

问题是什么? 如何使用 XMLHttpRequest 和来自 senderform 的键值对发送 GET 请求,该键值对指向表单元素(与它已经用于 POST 请求的方式相同)? 获取!= 发布。它们是完全不同的机制。您不能像使用 POST 一样使用 GET。要使用 GET 代替 POST,您需要解析表单,收集名称:值对,将它们添加到查询字符串中 - 就像您提供的链接一样。 所以当它是 GET 时将参数附加到 URL @whipdancer,我知道它们是不同的,我对在地址末尾附加键值对的一些自动方式感兴趣。但可能没有,所以我会尝试为此编写脚本,我只是不想编写可能已经存在的东西。 【参考方案1】:

最后我提出了这个解决方案,它从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 我能够解决我的问题。

【讨论】:

【参考方案2】:

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

【讨论】:

我建议你在浏览器调试模式下,在网络标签下,看看实际传输的是什么【参考方案3】:

由于您无法在 GET 请求中创建可用的正文(见下文),因此另一种选择是在 url 中使用参数。

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>

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

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

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

This answer 也解释了这个问题。

【讨论】:

感谢您的回答,它很好地解释了为什么我的解决方案不起作用。但是,它没有针对引用的表格进行调整。我已经发布了我已经找到的解决方案的答案。

以上是关于如何使用 GET 方法通过 XMLHttpRequest 传递 FormData的主要内容,如果未能解决你的问题,请参考以下文章

react中如何通过axios get方法发送参数?

Promise+js实现ajax请求

如何在Controller Java Spring中使用不同的GET方法

使用带有 URL 的 JavaScript 获取 HTML 代码

如何解决错误“尝试通过安全透明方法'System.Web.Http.GlobalConfiguration.get_Configuration()

如何在反应本机中使用 XMLHttpRequest 在 GET 方法的标头中传递授权令牌