Cuando el Método del senderform de envío es POST, todo funciona bien. Sin embargo, tan pronto como cambio el método a GET, no recibo nada en el servidor.
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); }Sé que podría agregar manualmente pares clave-valor al final de la dirección de la acción, pero el problema es que no sé qué formulario se pasará con qué campos.
Preferiría javaScript nativo si es posible.
¿Cómo puedo enviar una solicitud GET usando XMLHttpRequest con pares clave-valor de senderform que apunta a formar Elemento (de la misma manera que ya funciona para las solicitudes POST)?
Al final llegué con esta solución, que carga todos los pares clave-valor de la referencia del formulario de 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); }En combinación con la respuesta de @tanc y este artículo , pude resolver mi problema.
¿Estás seguro de que el problema no es el script PHP? No veo ninguna referencia de que https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#send() con FormData necesita POST para funcionar, pero si el script PHP toma la información de $POST o algo así (Mi PHP está oxidado), el comportamiento sería diferente.
Dado que no puede crear un cuerpo utilizable en una solicitud GET (consulte a continuación), la otra opción es usar parámetros en la 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>Una solicitud HTTP GET puede contener un cuerpo, pero ese cuerpo no tiene un significado semántico . Lo que significa, en términos simples, que un servidor no tiene ningún motivo ni conocimiento de cómo procesar el cuerpo de una solicitud GET. Si es posible escribir un servidor que pueda hacer esto, sería una mala práctica según las especificaciones de HTTP/1.1 :
si el método de solicitud no incluye una semántica definida para un cuerpo de entidad, entonces el cuerpo del mensaje DEBERÍA ignorarse al manejar la solicitud.
Y básicamente por eso no funciona. Si desea enviar cualquier tipo de datos a los que el servidor pueda responder, deberá utilizar un método HTTP diferente.
Esta respuesta también explica este problema.