Me gustaría enviar algunos datos usando un XMLHttpRequest en JavaScript.
Digamos que tengo el siguiente formulario en HTML:
<form name="inputform" action="somewhere" method="post">
<input type="hidden" value="person" name="user">
<input type="hidden" value="password" name="pwd">
<input type="hidden" value="place" name="organization">
<input type="hidden" value="key" name="requiredkey">
</form>
¿Cómo puedo escribir el equivalente usando un XMLHttpRequest en JavaScript?
javascript
ajax
post
xmlhttprequest
Jack Greenhill
fuente
fuente
params
lugar de una cadena como en jQuery?Connection
y losContent-Length
encabezados no se pueden establecer. Dirá "Se negó a configurar el encabezado inseguro" content-length "". Ver stackoverflow.com/a/2624167/632951application/json
solicitud?O si puede contar con el soporte del navegador, puede usar FormData :
fuente
http.setRequestHeader("Content-length", params.length);
yhttp.setRequestHeader("Connection", "close");
. ¿Son necesarios? ¿Acaso solo se necesitan en ciertos navegadores? (Hay un comentario en esa otra página que dice que configurar el encabezado Content-Length era "exactamente lo que se necesitaba")Content-Type
cambia automáticamentemultipart/form-data
. Esto tiene serias implicaciones en el lado del servidor y cómo se accede a la información allí.¡Utiliza JavaScript moderno!
Sugeriría investigar
fetch
. Es el equivalente de ES5 y utiliza Promesas. Es mucho más legible y fácilmente personalizable.En Node.js, deberá importar
fetch
utilizando:Si desea usarlo sincrónicamente (no funciona en el alcance superior):
Más información:
Documentación de Mozilla
¿Puedo usar (95% Mar 2020)
Tutorial de David Walsh
fuente
function()
ejemplos en caso de que no lo prefieras=>
. Absolutamente debería estar utilizando JS moderno para facilitar la experiencia del desarrollador. Preocuparse por un pequeño porcentaje de personas atrapadas en IE no vale la pena a menos que sea una gran empresathis
palabra clave. Me gusta mencionar eso, pero también odio en secreto a las personas que usan lathis
arquitectura de herencia en lugar de las fábricas de funciones. Perdóname, soy nodo.this
la peste, y cualquiera debería leerthis
.this
.Uso mínimo de
FormData
para enviar una solicitud AJAXObservaciones
Esto no responde completamente la pregunta de OP porque requiere que el usuario haga clic para enviar la solicitud. Pero esto puede ser útil para las personas que buscan este tipo de solución simple.
Este ejemplo es muy simple y no admite el
GET
método. Si le interesan los ejemplos más sofisticados, eche un vistazo a la excelente documentación de MDN . Consulte también una respuesta similar sobre XMLHttpRequest para publicar un formulario HTML .Limitación de esta solución: como señalaron Justin Blank y Thomas Munk (ver sus comentarios),
FormData
no es compatible con IE9 y versiones anteriores, y el navegador predeterminado en Android 2.3.fuente
FormData
es compatible con muchos navegadores, excepto IE9 y Android 2.3 (y OperaMini, pero este último no se usa ampliamente). Saludos ;-)onsubmit="return submitForm(this);"
contrario, el usuario será redirigido a la URL en la solicitud.false
. Sitrue
se devuelve, se enviará la solicitud POST original (no deseada). Su respuesta es correcta, perdón por la confusión.Asegúrese de que su API de backend pueda analizar JSON.
Por ejemplo, en Express JS:
fuente
¡NO SE NECESITAN PLUGINS!
Seleccione el siguiente código y arrástrelo a BOOKMARK BAR ( si no lo ve, habilítelo desde la Configuración del navegador ), luego EDITE ese enlace:
¡Eso es todo! ¡Ahora puede visitar cualquier sitio web y hacer clic en ese botón en BOOKMARK BAR !
NOTA:
El método anterior envía datos utilizando el
XMLHttpRequest
método, por lo tanto, debe estar en el mismo dominio mientras activa el script. Es por eso que prefiero enviar datos con un ENVÍO DE FORMULARIO simulado, que puede enviar el código a cualquier dominio; aquí hay un código para eso:fuente
XmlHttpRequest
en su respuesta: |Me he enfrentado a un problema similar, usando la misma publicación y en este enlace he resuelto mi problema.
Este enlace ha completado la información.
fuente
fuente
Intente utilizar el objeto json en lugar de formdata. a continuación está el código que funciona para mí. formdata tampoco funciona para mí, por lo tanto, se me ocurrió esta solución.
fuente
Solo para lectores destacados que encuentren esta pregunta. Descubrí que la respuesta aceptada funciona bien siempre que tenga una ruta determinada, pero si la deja en blanco, fallará en IE. Esto es lo que se me ocurrió:
Puedes hacerlo así:
fuente
Hay algunos duplicados que tocan esto, y nadie realmente lo explica. Tomaré prestado el ejemplo de respuesta aceptado para ilustrar
Simplifiqué esto en exceso (uso en
http.onload(function() {})
lugar de la metodología anterior de esa respuesta) en aras de la ilustración. Si usa esto tal cual, encontrará que su servidor probablemente está interpretando el cuerpo POST como una cadena y no comokey=value
parámetros reales (es decir, PHP no mostrará ninguna$_POST
variable). Usted debe pasar la cabecera del formulario de conseguir eso, y hacerlo anteshttp.send()
Si está utilizando JSON y no datos codificados en URL, pase en su
application/json
lugarfuente
Esto me ayudó, ya que solo quería usar
xmlHttpRequest
y publicar un objeto como datos de formulario:https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript
fuente