Chciałbym wysłać niektóre dane za pomocą XMLHttpRequest w JavaScript.
Powiedz, że mam następujący formularz w 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>
Jak napisać ekwiwalent za pomocą XMLHttpRequest w JavaScript?
javascript
ajax
post
xmlhttprequest
Jack Greenhill
źródło
źródło
params
zamiast ciągu, takiego jak w jQuery?Connection
iContent-Length
nagłówków nie można ustawić. Napis „Odmowa ustawienia niebezpiecznego nagłówka„ długość treści ””. Zobacz stackoverflow.com/a/2624167/632951application/json
zapytanie?Lub jeśli możesz liczyć na obsługę przeglądarki, możesz użyć FormData :
źródło
http.setRequestHeader("Content-length", params.length);
ihttp.setRequestHeader("Connection", "close");
. Czy są potrzebne? Czy być może są potrzebne tylko w niektórych przeglądarkach? (Na tej drugiej stronie znajduje się komentarz mówiący, że ustawienie nagłówka Content-Length było „dokładnie tym, co było potrzebne”)Content-Type
zmienia się automatycznie namultipart/form-data
. Ma to poważne konsekwencje po stronie serwera i sposobu dostępu do informacji.Użyj nowoczesnego JavaScript!
Proponuję zajrzeć do
fetch
. Jest to odpowiednik ES5 i wykorzystuje obietnice. Jest o wiele bardziej czytelny i łatwy do dostosowania.W Node.js musisz zaimportować,
fetch
używając:Jeśli chcesz używać go synchronicznie (nie działa w najwyższym zakresie):
Więcej informacji:
Dokumentacja Mozilli
Czy mogę używać (95% mar 2020)
Samouczek Davida Walsha
źródło
function()
przykłady na wypadek, gdybyś nie wolał=>
. Absolutnie powinieneś używać nowoczesnego JS, aby ułatwić programistom korzystanie z niego. Martwienie się o niewielki procent ludzi utkniętych w IE nie jest tego warte, chyba że jesteś wielkim przedsiębiorstwemthis
słowem kluczowym. Chciałbym o tym wspomnieć, ale potajemnie nienawidzę ludzi, którzy używająthis
architektury spadkowej zamiast fabryk funkcyjnych. Wybacz mi, jestem węzłem.this
też zarazy, podobnie jak każdy, kto czytathis
.this
.Minimalne użycie
FormData
do przesłania żądania AJAXUwagi
To nie w pełni odpowiada na pytanie OP, ponieważ wymaga kliknięcia użytkownika w celu przesłania żądania. Ale może to być przydatne dla osób szukających tego rodzaju prostego rozwiązania.
Ten przykład jest bardzo prosty i nie obsługuje tej
GET
metody. Jeśli interesują Cię bardziej wyrafinowane przykłady, zapoznaj się z doskonałą dokumentacją MDN . Zobacz także podobną odpowiedź na temat XMLHttpRequest dla Post HTML Form .Ograniczenie tego rozwiązania: jak wskazali Justin Blank i Thomas Munk (patrz ich komentarze),
FormData
nie jest obsługiwany przez IE9 i nowsze wersje oraz domyślną przeglądarkę na Androidzie 2.3.źródło
FormData
jest obsługiwany przez wiele przeglądarek oprócz IE9 i Androida 2.3 (i OperaMini, ale ta ostatnia nie jest powszechnie używana). Pozdrawiam ;-)onsubmit="return submitForm(this);"
przeciwnym razie użytkownik zostanie przekierowany do adresu URL w żądaniu.false
. Jeślitrue
zostanie zwrócony, zostanie wysłane oryginalne (niechciane) żądanie POST! Twoja odpowiedź jest poprawna, przepraszam za zamieszanie.Upewnij się, że interfejs API zaplecza może analizować JSON.
Na przykład w Express JS:
źródło
NIE POTRZEBNE WTYCZKI!
Wybierz poniższy kod i przeciągnij go do paska BOOKMARK ( jeśli go nie widzisz, włącz w ustawieniach przeglądarki ), a następnie EDYTUJ ten link:
To wszystko! Teraz możesz odwiedzić dowolną stronę internetową i kliknąć ten przycisk w BOOKMARK BAR !
UWAGA:
Powyższa metoda wysyła dane przy użyciu
XMLHttpRequest
metody, więc musisz być w tej samej domenie podczas uruchamiania skryptu. Dlatego wolę wysyłać dane z symulowanym FORMULARZEM FORMULARZA, który może wysłać kod do dowolnej domeny - oto kod do tego:źródło
XmlHttpRequest
w twojej odpowiedzi:Napotkałem podobny problem, używając tego samego posta i tego linku rozwiązałem problem.
Ten link zawiera informacje.
źródło
źródło
Spróbuj użyć obiektu json zamiast formdata. poniżej jest kod działający dla mnie. formdata też dla mnie nie działa, dlatego wymyśliłem to rozwiązanie.
źródło
Tylko dla czytelników, którzy znajdą to pytanie. Przekonałem się, że zaakceptowana odpowiedź działa dobrze, dopóki masz określoną ścieżkę, ale jeśli pozostawisz ją pustą, zakończy się niepowodzeniem w IE. Oto, co wymyśliłem:
Możesz to tak:
źródło
Dotykają tego pewne duplikaty i nikt tak naprawdę tego nie wyjaśnia. Pożyczę przykład z zaakceptowaną odpowiedzią do zilustrowania
Upraszczałem to (używam
http.onload(function() {})
zamiast starszej metodologii tej odpowiedzi) dla ilustracji. Jeśli użyjesz tego tak, jak jest, przekonasz się, że twój serwer prawdopodobnie interpretuje treść POST jako ciąg znaków, a nie rzeczywistekey=value
parametry (tj. PHP nie pokaże żadnych$_POST
zmiennych). Państwo musi zdać w nagłówku formularza, aby ta, a nie, że przedhttp.send()
Jeśli używasz JSON, a nie danych zakodowanych w adresie URL, podaj
application/json
zamiast tegoźródło
Pomogło mi to, ponieważ chciałem tylko użyć
xmlHttpRequest
i opublikować obiekt jako dane formularza:https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/Sending_forms_through_JavaScript
źródło