ugrás a tartalomhoz

AJAX - Küldés POSTban

Kérésre törölve 10. · 2005. Szep. 14. (Sze), 16.21
Sziasztok!
Lenne egy kérdésem. Szeretném megtudni, hogy hogyan tudok a createRequestObject osztállyal POST változókat hozzáadni a kéréshez. Mert a GET ugye nem tud korlátlan adatot küldeni az URL-ben, ezért kéne a POST. Valaki tud segíteni?
Előre is köszönöm!
__________
by ChaTeve
 
1

milyen createRequestObject?

Hojtsy Gábor · 2005. Szep. 14. (Sze), 23.02
Ez valamilyen nyelvnek beépített osztálya? Milyen nyelv? Vagy mégsincs beépítve?
2

Ezt az osztályt

Kérésre törölve 10. · 2005. Szep. 15. (Cs), 16.21
Rasmus Lerdorf cikkében használt kódot használom:

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}

var http = createRequestObject();

function sndReq(action) {
    http.open('post', 'ajax.php');
    //Itt kéne a POST változók definiálását megoldani
    http.onreadystatechange = handleResponse;
    http.send(null);
}

function handleResponse() {
    if(http.readyState == 4){
        var response = http.responseText;
        var update = new Array();

        if(response.indexOf('|' != -1)) {
            update = response.split('|');
            var element = document.getElementById(update[0]);
			element.innerHTML = update[1];
        }
    }
}
___________
by ChaTeve
3

naja...

Hojtsy Gábor · 2005. Szep. 15. (Cs), 17.12
Ezt nem árt tudni :) Bárki bármilyen createRequestObject() függvényt (nem objtektumot!) csinálhatna...

Namost ezt használva szépen meg kell nézni, hogy a kétféle XMLHTTPRequest mit támogat. Van nekik egy send() metódusuk, amiben karaktersorozatot meg lehet adni, és be lehet állítani fejléceket. Innentől kezve a problémát egy HTTP kérés összeállításának kérdésére redukáltuk. Be kell állítani a POST metódust, ez megvan. Be kell állítani a content-type fejlécet url kódolt adatküldésnek megfelelően, és a send() paraméterének meg kell adni az URL kódolt adatokat.
4

EZ jó?

Kérésre törölve 10. · 2005. Szep. 15. (Cs), 18.18
Kipróbáltam, ez működik:

http.open('post', 'ajax2.php');
http.onreadystatechange = handleResponse;
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=iso-8859-2');
http.send('action=foo');
Akkor ez POST-ban küldi el, ugye?
___________
by ChaTeve
5

több böngészőn

Hojtsy Gábor · 2005. Szep. 15. (Cs), 18.23
Az elmélet az, hogy ennek működnie kell, igen. A send()-ben használt karaktersorozatok megfelelő URL kódolására kiváló függvények vannak JS-ben. Azért érdemes kipróbálni több böngészőben.
6

Így állok

Kérésre törölve 10. · 2005. Szep. 15. (Cs), 20.27
Szóval elkezdtem írni az alkalmazást, de hibába ütköztem és sehogy sem jövök rá, mi lehet a gond.
Itt van a HTML része az alkalmazásnak:

<body onLoad="sndLoadReq()">
<div id="chat_status"></div>
<p align="center">
  <textarea name="chat_output" cols="100" rows="10" id="chat_output"></textarea>
 </p> 
 <form method="post" onSubmit="sndInputReq(); return false;" name="Input_Form" id="Input_Form">
    <p align="center">
      <textarea name="chat_input" cols="100" rows="5" id="chat_input"></textarea>
</p>
    <p align="center">
      <input type="submit" name="Submit" value="Üzenet küldése" />
</p>
</form>
</body>
Tudom, hogy nem túl szép, de egyenlőre még csak tervezgetek.
A headben van egy kis JavaScript rész, ami bizonyos ídőközönként meghív egy függvényt:

<script type="text/javascript" language="javascript">
ID = window.setTimeout('sndUpdateReq()', 1000);
function sndUpdateReq() {
	sndGetReq();
	sndCheckReq();
	ID = window.setTimeout('sndUpdateReq()', 1000);
}
</script>
És a JavaScript AJAX része:

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest();
    }
    return ro;
}

var http = createRequestObject();
var input;
  
function utf8(wide) {
    var c, s;
    var enc = "";
    var i = 0;
    while (i < wide.length) {
      c= wide.charCodeAt(i++);
      // handle UTF-16 surrogates
      if (c>=0xDC00 && c<0xE000) continue;
      if (c>=0xD800 && c<0xDC00) {
        if (i>=wide.length) continue;
        s= wide.charCodeAt(i++);
        if (s<0xDC00 || c>=0xDE00) continue;
        c= ((c-0xD800)<<10)+(s-0xDC00)+0x10000;
      }
      // output value
      if (c<0x80) enc += String.fromCharCode(c);
      else if (c<0x800) enc += String.fromCharCode(0xC0+(c>>6),0x80+(c&0x3F));
      else if (c<0x10000) enc += String.fromCharCode(0xE0+(c>>12),0x80+(c>>6&0x3F),0x80+(c&0x3F));
      else enc += String.fromCharCode(0xF0+(c>>18),0x80+(c>>12&0x3F),0x80+(c>>6&0x3F),0x80+(c&0x3F));
    }
    return enc;
  }

function toHex(n) {
    var hexchars = "0123456789ABCDEF";
    return hexchars.charAt(n>>4)+hexchars.charAt(n & 0xF);
  }
function encodeURIComponent(s) {
    var okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-";
    var s = utf8(s);
    var c;
    var enc = "";
    for (var i= 0; i<s.length; i++) {
      if (okURIchars.indexOf(s.charAt(i)) == -1)
        enc += "%" + toHex(s.charCodeAt(i));
      else
        enc += s.charAt(i);
    }
    return enc;
  }

function sndGetReq() {
    http.open('post', 'ajax.php');
    http.onreadystatechange = handleResponse;
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
    http.send('action=get');
	
}

function sndInputReq() {
    http.open('post', 'ajax.php');
    http.onreadystatechange = handleResponse;
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
    http.send('action=load&action=set&uzenet=' + encodeURIComponent(document.Input_Form.chat_input.value));
	document.Input_Form.chat_input.value = "";
}

function sndLoadReq() {
    input = prompt('Milyen néven akarsz bejelentkezni?');
	http.open('post', 'ajax.php');
    http.onreadystatechange = handleResponse;
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
    http.send('action=load&name=' + encodeURIComponent(input));
}

function sndCheckReq() {
	http.open('post', 'ajax_check.php');
    http.onreadystatechange = handleResponse;
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
    http.send(null);
}

function handleResponse() {
    if(http.readyState == 4){
        var response = http.responseText;
        var update = new Array();

        if(response.indexOf('*******' != -1)) {
            update = response.split('*******');
            var element = document.getElementById(update[0]);
			if (element == 'chat_status') {
				element.innerHTML = update[1];
			}
			else {
				element.innerHTML += update[1];
			}
        }
    }
}
Szóval valami chat szerűséget szeretnék csinálni, a PHP egyenlőre semmilyen hibajelzést nem ad. A JavaScript konzol viszont igen:
Hiba: uncaught exception: [Exception... "Component returned failure code: 0x804b000f [nsIXMLHttpRequest.setRequestHeader]" nsresult: "0x804b000f (<unknown>)" location: "JS frame :: ajax.js :: sndCheckReq :: line 83" data: no]
Az ajax.js a JavaScript AJAX része... Meg egy ilyet is ad:
Hiba: element has no properties
Forrásfájl: ajax.js
Sor: 99

A 99. sor:
element.innerHTML += update[1];
Próbáltam már itt a value tulajdonságot, az innerTEXT-t (ezt egy barátom mondta), de mindegyiknél ezzel a hibával jött.
Elnézést, ha kicsit túl nagy falat a problémám. Egyébként az EncodeURIComponent a Weblabortól szedtem, remélem nem baj.
___________
by ChaTeve
7

<Nincs cím>

Kérésre törölve 10. · 2005. Szep. 16. (P), 19.42
Senki nem tudja a probléma okát?
___________
by ChaTeve
8

ezt találtam

Anonymous · 2006. Május. 25. (Cs), 16.27
Note that if you want to POST data, you have to change the MIME type of the request using the following line:

http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Otherwise, the server will discard the POSTed data.
9

prototype?

Anonymous · 2006. Május. 25. (Cs), 17.24
azt tudjuk,hogy prototype-al könnyen lehet post-ban adatot küldeni, akövetkezőképpen:
var myAjax = new Ajax.Request(
			url, 
			{
				method: 'get', 
				parameters: pars, 
				onComplete: showResponse
			});
Próbáld ki,hogy ezzel működik-e.
10

post

Anonymous · 2006. Május. 25. (Cs), 17.25
vagyis method: 'post'
elírtam:)
11

passsz

toxin · 2006. Május. 25. (Cs), 18.36
nálam müxik, szóval passsz, beírom: árvíztűrő tükörfúrógép, firebug-al nézve (fú a 0.4-es milyen lett má :) ) a post-ot

action=load&action=set&uzenet=%C3%A1rv%C3%ADzt%C5%B1r%C5%91%20t%C3%BCk%C3%B6rf%C3%BAr%C3%B3g%C3%A9p

response, meg nyilván nincs ajax_check.php nélkül (nagyon nem mélyedtem el benne mondjuk, egyébként használd ahogy írták a prototype-ot , vagy ha zavar a mérete akkor a http://moofx.mad4milk.net/#download -ban lite verzsönt , magyar doksi http://prototype.rajmi.hu/prototype.js.hu.html )