odpowiedź na HTTP POST

0

Witam,

własnie raczkuje z tworzeniem stron i moje pytanie może będzie trochę głupie :P

zrobiłem sobie prosty guziczek, który wysyła jakie dane metodą POST do serwera ,a serwer mi odpisuje. I własnie po nacisnieciu guzika wszystko znika i wyswietla się tylko wiadomosc od serwera. No i chciałbym tego uniknąć ,a wiadomosc od serwera wrzucić do jakiej zmiennej ,da się?

0

Da się. Musisz wysłać tego posta asynchronicznie przez ajaxa.

0

Dobra ,a wysłać do serwera też muszę ajaxem?

już wiem ,nie doczytałem:P

0

Ok, zrobiłem taki kod i niby działa, ale jest co nie tak. Odpalony w IE działa ,ale wyswietla komunikat najpierw wyswietla sie komunikat o zawartosci skryptów ActiveX, które muszę odblokować (niby nic,ale pewnie większosc stron z tego korzysta,a taki komunikat się zwykle niepojawia). No a w FF nie działa w ogóle :/

 <script type="text/javascript">
        function loadXMLDoc() {
            var xmlhttp = new XMLHttpRequest();
            var out;
          if (xmlhttp ==+ null){alert('AJAX not supported');}
          
          
var params= 'v1=123&v2=dsfs';
            xmlhttp.onreadystatechange = function() {
                if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    out = xmlhttp.responseText;
                    alert(out);
                }
            };
             xmlhttp.open("POST", "http://test.php", true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.setRequestHeader("Connection", "close");

            xmlhttp.send(params);
          alert( xmlhttp.responseBody);
        }

<button onclick="loadXMLDoc()" >Search</button>
        </script> 
0

w kodzie guzik jest pod sekcją JS ,a nie w srodku - źle przykleiłem.

0

Ustawiasz taki dziwny content type i stąd pewnie prośba o activeX...

edit: źle popatrzyłem :) Na oko źle przesyłasz parametry bo parametry POSTa w przeciwieństwie do GETa nie są tak doklejane do adresu. Zresztą pod FF masz Firebuga i możesz sobie w zakładce "network" zobaczyć czemu ci ten ajax nie hula.

0

no właśnie, że tak są

http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp

niżej błąd

if (xmlhttp ==+ null)
0

tak, poprawiłem już ten błąd, ale na FF nadal nie działa.

Odpaliłem firebuga, na osi czasu pokazuje najpierw blokowanie,a potem oczekiwanie, ale niczego nie odbiera i nie mówi dlaczego.

Parametry moim zdaniem są w porządku, a jeśli nie to jak powinny być?

0

Porównałem w ognistym żuku POSTy wysłane przez Ajaxa i bez Ajaxa (które działają) . Ajax dodaje sam od siebie kilka ustawień w nagłówku:

 Cache-Control	no-cache
Origin	null
Pragma	no-cache

Nie wiem czy to może być przyczyną problemu?

0
  1. Jak testujesz bez ajaxa i po czym wnosisz, że bez niego działa?
  2. Czy Twój serwer testowy na pewno działa?
  3. W tym skrypcie z ajaxem funkcja będzie działać tylko jeśli zwrócony kod jest 200, może coś nie tak ze statusem?
0

Ale po co AJAX? Nie prościej po prostu renderować odpowiedni content, jeśli typ zapytania ($_SERVER['REQUEST_METHOD']) to 'POST'?

0
Swr napisał(a):
  1. Jak testujesz bez ajaxa i po czym wnosisz, że bez niego działa?
  2. Czy Twój serwer testowy na pewno działa?
  3. W tym skrypcie z ajaxem funkcja będzie działać tylko jeśli zwrócony kod jest 200, może coś nie tak ze statusem?
  1. po tym ,że jak działa wyświetla odpowiedź serwera, a jak nie działa to nie (undefined)
alert( xmlhttp.responseBody);

W FireBugu w zakładce odpowiedź jak działa to wyświetla odpowiedź, jak nie działa to wyswietla komunikat: "Odśwież stronę, by pobrać kod źródłowy dla:"

  1. tak, bez ajaxa wysyła odpowiedź
  2. status w FireBugu pokazuje 200 OK dla obu
kapec94 napisał(a):

Ale po co AJAX? Nie prościej po prostu renderować odpowiedni content, jeśli typ zapytania ($_SERVER['REQUEST_METHOD']) to 'POST'?

Zrobiłbym to najchętniej w jakikolwiek sposób ,byle działało ,ale nie wiem co to znaczy "renderować content" :P Może więcej szczegółów?

0

Boże, @danek, ale Cię tu męczą :/

Użyj jakieś biblioteki do ajaxa - wszystkie problemy znikną jak ręką odjął.

Jeżeli na stronie korzystasz z jQuery - to jQuery ma do tego funkcje. Jeżeli nie, a nie chcesz ładować tego w sumie sporego frameworka - skorzystaj z biblioteki, która ma w sobie tylko funkcje ajax, np. takie coś Google wypluwa, jest też gałąź jQuery, która ma tylko funkcje ajax, bez całej reszty. Ew. załaduj jQuery używając publicznych CDN-ów - z jQuery korzysta (z tego co pamiętam) ok. 90% z miliona najpopularniejszych stron - korzystając z CDNów masz szansę, że i tak ktoś z tego korzysta, więc ładowanie strony nie będzie dłuższe.

Czysty ajax to dla mnie pakowanie się w kłopoty. O ile lubię czysty js to do ajaxa zawsze biblioteka.

0
danek napisał(a):
Swr napisał(a):
  1. Jak testujesz bez ajaxa i po czym wnosisz, że bez niego działa?
  1. po tym ,że jak działa wyświetla odpowiedź serwera, a jak nie działa to nie (undefined)
alert( xmlhttp.responseBody);

No i właśnie źle sprawdzasz!
Ten alert wywoła się przy wywołaniu loadXMLDoc() a nie przy uzyskaniu odpowiedzi od serwera.

Jeśli chcesz wyświetlić odpowiedź serwera to powinieneś ten alert umieścić w funkcji przypisanej do xmlhttp.onreadystatechange(co jest w sumie zrobione, dlatego alert( xmlhttp.responseBody); jest niepotrzebne).

0
Swr napisał(a):
danek napisał(a):
Swr napisał(a):
  1. Jak testujesz bez ajaxa i po czym wnosisz, że bez niego działa?
  1. po tym ,że jak działa wyświetla odpowiedź serwera, a jak nie działa to nie (undefined)
alert( xmlhttp.responseBody);

No i właśnie źle sprawdzasz!
Ten alert wywoła się przy wywołaniu loadXMLDoc() a nie przy uzyskaniu odpowiedzi od serwera.

Jeśli chcesz wyświetlić odpowiedź serwera to powinieneś ten alert umieścić w funkcji przypisanej do xmlhttp.onreadystatechange(co jest w sumie zrobione, dlatego alert( xmlhttp.responseBody); jest niepotrzebne).

Masz rację , skasowałem ten drugi alert i zaraz przetestuje. Chociaż za cholerę nie mogę zrozumieć, dlaczego wcześniej dostaje odpowiedź od serwera zanim w ogóle funkcja wykona xmlhttp.open() i prześle parametry do nagłówka :P

dzek69 napisał(a):

Boże, @danek, ale Cię tu męczą :/

Użyj jakieś biblioteki do ajaxa - wszystkie problemy znikną jak ręką odjął.

Jeżeli na stronie korzystasz z jQuery - to jQuery ma do tego funkcje. Jeżeli nie, a nie chcesz ładować tego w sumie sporego frameworka - skorzystaj z biblioteki, która ma w sobie tylko funkcje ajax, np. takie coś Google wypluwa, jest też gałąź jQuery, która ma tylko funkcje ajax, bez całej reszty. Ew. załaduj jQuery używając publicznych CDN-ów - z jQuery korzysta (z tego co pamiętam) ok. 90% z miliona najpopularniejszych stron - korzystając z CDNów masz szansę, że i tak ktoś z tego korzysta, więc ładowanie strony nie będzie dłuższe.

Czysty ajax to dla mnie pakowanie się w kłopoty. O ile lubię czysty js to do ajaxa zawsze biblioteka.

Może to głupie pytanie ,ale jak zainstalowac bibliotekę?
Tak:

 <script src="http://www.ajaxtoolbox.com/request/full/AjaxRequest.js"></script> 
  <script type="text/javascript">
Blok JS
</script>

czy tak:

 <script src="http://www.ajaxtoolbox.com/request/full/AjaxRequest.js">
  
Blok JS
</script>
0

Może to głupie pytanie ,ale jak zainstalowac bibliotekę?

opcja pierwsza.

a przy okazji: type nie jest w zasadzie potrzebne

0

Próbowałem z JQuery korzystając z gotowego przykładu ,ale czarno to widzę, nawet nie pokazuje komunikatu o błędzie!

http://jsbin.com/uzicet/1/edit

Może mi kto wkleić działającą ( i sprawdzoną) funkcję HTTP Post opartą na Ajaxie ? Myslę, że tak będzie najprosciej.

0

No proszę, 90% internetu z tego korzysta a trudno o gotowy przykład :)

0

Nie zadziała Ci przykład, który podałeś, bo treści musisz pobierać z tej samej domeny, z której zostało wysłane zapytanie. Więc to co jest na pastebinie nie pójdzie.

0
winerfresh napisał(a):

Nie zadziała Ci przykład, który podałeś, bo treści musisz pobierać z tej samej domeny, z której zostało wysłane zapytanie. Więc to co jest na pastebinie nie pójdzie.

Więc ja chcę wysyłać zapytanie do innej domeny, niż ta z której wysyłam zapytanie, jak to rozwiązać?

0
danek napisał(a):
winerfresh napisał(a):

Nie zadziała Ci przykład, który podałeś, bo treści musisz pobierać z tej samej domeny, z której zostało wysłane zapytanie. Więc to co jest na pastebinie nie pójdzie.

Więc ja chcę wysyłać zapytanie do innej domeny, niż ta z której wysyłam zapytanie, jak to rozwiązać?

na serwerze do którego wysyłasz musisz pozwolić Twojej domenie na wysyłanie danych z domeny pierwszej wysyłając nagłówek

Access-Control-Allow-Origin: http://www.domena.pl
(lub po prostu *)

i pozwolić na metodę POST nagłówkiem:

Access-Control-Allow-Methods: POST, GET, OPTIONS

do zapytań GET mógłbyś jeszcze użyć JSONP, ale POST z danymi zwrotnymi tylko w ten sposób

jeżeli serwer nie należy do Ciebie to jedynie możesz na swoim serwerze napisać np skrypt .php który wyśle zapytanie POST (np przez CURL) w imieniu serwera i odwoływać się do niego przez ajax (będzie w tej samej domenie więc nie będzie problemu)

0

czyli problemem jest HTTP access control (CORS) ? https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
próbowałem wcześniej to wyłączyć, np. stosując wtyczkę do FF https://addons.mozilla.org/pl/firefox/addon/forcecors/?src=userprofile ,ale nic nie dało.

czy da się to zrobić innym sposobem bez użycia curla ?

0

nie da się
możesz jedynie wysłać dane POST, ale nie dostaniesz odpowiedzi - byłoby to zbyt niebezpieczne dla użytkownika przeglądarki, bo mógłbyś w jego imieniu przeglądać Internet

jeśli chcesz żeby ten dodatek zadziałał to edytuj plik defaults/preferences/forcecors.js w źródłach tej wtyczki (to są zwykłe pliki .zip ze zmienionym rozszerzeniem)

zamień linijkę:

pref('forcecors.headers', 'Access-Control-Allow-Origin *|Access-Control-Allow-Methods POST,GET');

na:

pref('forcecors.headers', 'Access-Control-Allow-Origin *|Access-Control-Allow-Methods POST,GET|Access-Control-Request-Headers *');
(albo po prostu zmień to w about:config)

i powinno działać (nie sprawdzane).
Łatwiej to zrobić używając chrome'a - uruchom chrome z parametrem:

chrome.exe --disable-web-security

Tak czy inaczej - działać będzie tylko u Ciebie

0

Problem prawie rozwiązany! Postawiłem własny serwer(localhost) z obsługą php (webserv.pl). Napisałem skrypt php obsługujący HTTP POST . Parametry do wysłania przesyłam mu metodą GET ,żeby było prościej.

Nowy problem jest taki ,że zapytanie POST przez php trwa niemiłosiernie długo! To samo zapytanie i ta sama odpowiedź od serwera wysłane przez HTML lub Ajaxa trwa pół sekundy ,a przez PHP 20 sekund! Co może być przyczyną?

<?php
function SendPost($v1,$v2,$v3){
$url = 'http://strona.pl';
$data = array('value1' => $v1, 'value1' => $v2,  'value2=3' => $v3);

$options = array(
    'http' => array(
        'header'  => ""Content-type: application/x-www-form-urlencoded\r\nAccept-Encoding: gzip, deflate\r\nConnection: Close\r\n"",
        'method'  => 'POST',
        'content' => http_build_query($data),
    ),
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);

echo($result);
}
SendPost($_GET['value1'] , $_GET['value2'] ,  $_GET['value3'] );
?>
0

problemem jest to że file_get_contents nie kończy połączenia po odebraniu danych, tylko czeka na jego zakończenie - a te jest podtrzymywane przez serwer
teoretycznie problem powinien zniknąć po dodaniu nagłówka Connection: Close

kod powyżej jest błędny - są w nim jakieś podwójne cudzysłowy. Przeklej dokładnie kod tak jak masz, bo ten powyżej nie ma prawa działać, a kluczem tutaj jest ustawienie tego nagłówka, którego prawdopodobnie nie ustawiasz

albo użyj po prostu CURL

0

Wkleiłem dokładnie to, co mam. Pisząc post w międzyczasie próbowałem różnych opcji nagłówka i musiałem edytować tą linijkę kodu kilka razy ,aż do wersji ostatecznej, wtedy jakoś zaplątały się te dodatkowe cudzysłowie, ale oprócz nich wszystko jest tak samo.

Zauważyłem ,że czas bardzo mocno zależy od wielkości odpowiedzi serwera. Przy 45KB wszystko zajmuje tylko 1,9 s ,ale przy 300 KB już 17s (a odpowiedź zwykle ma 300-350 KB).

0

spróbuj usunąć nagłówek Accept-Encoding: gzip, deflate żeby serwer nie kompresował odpowiedzi, bo być może jej rozpakowanie tyle zajmuje phpowi
tak czy inaczej, ja bym już dawno przeszedł na curl'a

0

wyjaśniło się, przez pomyłkę testując PHP POST przesyłałem do serwera taką konfigurację parametrów, że musiał się trochę za dużo napracować
Teraz wszystko śmiga i jest OK.

Poza tym użycie curla też zmniejszyło czas odpowiedzi o 1-3s :)

miał być guziczek, a skończyłem z serwerem, trochę to wszystko zbyt skomplikowane

1 użytkowników online, w tym zalogowanych: 0, gości: 1