Problem mit xmlhttpRequest:
Philipp
- javascript
0 Andreas Dölling0 molily
0 Philipp
1 Thomas J.S.0 Philipp
0 Philipp
Hallo
Folgendes Szenario: Mein Webbrowser schickt XMLRequests an ein API und erhaelt dann als Antwort ein XML Dokument. Als Schnittstelle verwende ich das CGI. Fuer das senden der Requests verwende ich das AJAX Konzept. Das Problem ist nun, dass ich die responsexml kein Objekt enthaelt. D.h. der IE gibt die Fehlermeldung aus das das erhaltene Objekt null oder kein Objekt ist, und der FFox gibt die Fehlermeldung aus das die responsexml keine Properties hat.
Ich habe nun die generierte XML Antwort von meiner CGI Anwendung (CProgramm) in einer Textdatei ausgegeben und das schaut folgendermassen aus:
<?xml version="1.0"?><api_information>
<api_version>R2004_01_28.5071</api_version><engine_version>
2.10.5119</engine_version></api_information>
Schaut fuer mich eigentlich wie ein sauberes XML Dokument aus und wird in xmlresponse gespeichert.
Das Resultat rausgeschrieben wird folgendermassen:
printf("Content-type: text/xml\n\n %s", xmlresponse);
Hat hier irgendjemand eine Idee wo das Problem liegen koennte? Das witzige ist das es mit IE 5.0 noch funktioniert hat. Seit ich auf die 6er Version upgedated habe habe ich nun oben genanntes Problem
Danke fuer Tips
Philipp
Hallo,
leider fällt mir da jetzt auch nichts Konkretes ein. Ich habe nur gesehen, daß ich in meiner AJAX-Anwendung im XML-Header noch das standalone-Attribut mitgebe:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Kann mir aber nicht vorstellen, daß es daran liegt.
Kannst Du vielleicht den relevanten JS-Code Deiner Anwendung posten? Vielleicht hilft das weiter bei der Fehlerlokalisierung.
Ciao,
Andreas
Hi
Kann mir aber nicht vorstellen, daß es daran liegt.
Kannst Du vielleicht den relevanten JS-Code Deiner Anwendung posten? Vielleicht hilft das weiter bei der Fehlerlokalisierung.
Danke fuer Deine Antwort, aber das witzige ist wie gesagt das es mit IE5 noch funktioniert hat! Hier ist nun der entsprechende JS Code. Abhaengig von dem Knopf der gedrueckt wird, wird eine bestimmter XML Request geschickt.
<script language="javascript" type="text/javascript">
var xmlrequest;
var url = "http://localhost/cgi-bin/GetPost.exe"; // The server-side script
function handleHttpResponse() {
if (http.readyState == 4) {
if (xmlrequest == 0) {
document.getElementById('XMLRequest1').value = "New Session Established Successfull";
}
else if(xmlrequest == 1) {
alert(http.responsexml);
response = http.responsexml.documentElement;
api_version = response.getElementsByTagName('api_version')[0].firstChild.data;
engine_version = response.getElementsByTagName('engine_version')[0].firstChild.data;
document.getElementById('XMLRequest1').value = "Api_Version:" + api_version + "Engine_Status:" + engine_version;
}
else if (xmlrequest == 2) {
response = http.responsexml.documentElement;
up_since = response.getElementsByTagName('up_since')[0].firstChild.data;
up_duration = response.getElementsByTagName('up_duration')[0].firstChild.data;
document.getElementById('XMLRequest1').value = "Up since:" + up_since + "Duration:" + up_duration;
}
}
}
function XMLRequest(request) {
xmlrequest = request;
http.open("POST", url, true);
http.setRequestHeader("Content-Type", "text/xml");
http.onreadystatechange = handleHttpResponse;
if (request == 0) {
http.send("<?xml version="1.0" encoding="UTF-8"?><rl_api_cmd>new_session</rl_api_cmd>");
}
else if (request == 1) {
http.send("<?xml version="1.0" encoding="UTF-8"?><rl_api_cmd>get_information</rl_api_cmd>");
}
else if (request == 2) {
request = 2;
http.send("<?xml version="1.0" encoding="UTF-8"?><rl_api_cmd>get_engine_status</rl_api_cmd>");
}
}
function getHTTPObject() {
var xmlhttp;
/*@cc_on
@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
@else
xmlhttp = false;
@end @*/
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
try {
xmlhttp = new XMLHttpRequest();
} catch (e) {
xmlhttp = false;
}
}
return xmlhttp;
}
Waer toll wenn mir hier jemand sagen koennte wo der Hund begraben liegt!
Gruss Philipp
Hi,
sorry, daß es so lange gedauert hat - muß halt "nebenbei" arbeiten.
;)
Eine Idee habe ich aber immer noch nicht zu Deinem Problem. Ich selbst hatte ein etwas einfacheres Script, bei dem nur Formulardaten validiert wurden.
Hast Du denn schon mal geprüft, was bei Deinem Backend-CGI überhaupt als Anfrage ankommt? Du kannst Die Anfrage ja z.B. in eine Textdatei schreiben.
Was mir sonst gerade noch auffällt: es muß heißen "req.responseXML", also das "XML" groß!
Ciao,
Andreas
Hi
Hast Du denn schon mal geprüft, was bei Deinem Backend-CGI überhaupt als Anfrage ankommt? Du kannst Die Anfrage ja z.B. in eine Textdatei schreiben.
Was mir sonst gerade noch auffällt: es muß heißen "req.responseXML", also das "XML" groß!
Kein Problem dass es etwas laenger gedauert hat, aber leider hat das XML gross schreiben auch nix geholfen...
Ja also die Anfrage kommt sicher richtig an, und auch die Antwort von dem API passt. Schaut fuer mich wie ein sauberes XML Dokument aus. Weiss auch nicht wieso sich der IE und FFox hier aufregen...
Komisch, komisch....
Hallo,
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); ?
gruss
Hallo,
äh, bzw:
[..]
if (xmlhttp.readyState==4) {
if (xmlhttp.status == 200){
[..]
du solltest noch prüfen ob der server auch 200 zurückgegeben hat, wenn nicht, solltest du dir mal ausgeben lassen, was der server für einen status zurückgegeben hat, sowie mit alert(xmlhttp.responseText); wenn der vorhanden ist, dann gibt es einen fehler beim xml parsen.
gruss
Hi
xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
Danke aber der Request passt ja, das XML wird ordentlich verarbeitet und ich bekomme ja auch eine Antwort die wie XML ausschaut ;) Muss eher am printf irgendwie was faul sein denk ich mir...
Gruss
Philipp
Hallo,
was dem ie immer aufstösst (dem ff übrigens nicht), ist, wenn die Antwort nicht UTF-8 codiert ist.
gruss
Hi,
<script language="javascript" type="text/javascript">
var xmlrequest;
var url = "http://localhost/cgi-bin/GetPost.exe"; // The server-side script
function handleHttpResponse() {
if (http.readyState == 4) {
Was ist http hier?
function XMLRequest(request) {
xmlrequest = request;
http.open("POST", url, true);
Was ist http hier?
function getHTTPObject() {
Wird diese Funktion auch irgendwo aufgerufen?
Ich seh keinen Aufruf.
cu,
Andreas
Hi
Wird diese Funktion auch irgendwo aufgerufen?
Ich seh keinen Aufruf.
Wird gleich nach der Funktionsdeklaration aufgerufen
var http = getHTTPObject(); // We create the HTTP Object
Gruss
Philipp
Hallo,
Das Resultat rausgeschrieben wird folgendermassen:
printf("Content-type: text/xml\n\n %s", xmlresponse);
Ich glaube nicht, dass es etwas mit deinem konkreten Problem zu tun hast, aber hier solltest du auf jeden Fall application/xml statt text/xml verwenden, weil für text/xml beknackte Kodierungsregeln gelten.
Ansonsten: Kannst du das Ganze nicht einmal online stellen?
Mathias
Hi
Ansonsten: Kannst du das Ganze nicht einmal online stellen?
Klar kann ich mal mein CGI online stellen, es kommunziert halt mit einer API.
static unsigned long size;
char *getdata()
{
char *puffer = NULL;
char *request = getenv("REQUEST_METHOD");
char *cont_len;
// char *cgi_string;
/* Zuerst die Request-Methode überprüfen */
if( NULL == request )
return NULL;
/*
else if( strcmp(request, "GET") == 0 )
{
Die Methode GET -> Query String abholen
cgi_string = getenv("QUERY_STRING");
if( NULL == cgi_string )
return NULL;
else
{
puffer =(char *) strdup(cgi_string);
return puffer;
}
}
*/
else if( strcmp(request, "POST") == 0 )
{
/* Die Methode POST -> Länge des Strings
ermitteln (CONTENT_LENGTH) */
cont_len = getenv("CONTENT_LENGTH");
if( NULL == cont_len)
return NULL;
else
{
/* String CONTENT_LENGTH in
unsigned long umwandeln */
size = (unsigned long) atoi(cont_len);
if(size <= 0)
return NULL; /* Keine Eingabe!?!? */
}
/* Jetzt lesen wir die Daten von stdin ein */
puffer =(char *) malloc(size+1);
if( NULL == puffer )
return NULL;
else
{
if( NULL == fgets(puffer, size+1, stdin) )
{
free(puffer);
return NULL;
}
else /* Rückgabewerte an den Ausrufer */
return puffer;
}
}
else /* Weder GET-Methode noch die POST-Methode
wurden verwendet */
return NULL;
}
void main() {
FILE *fp;
char *buff = NULL;
unsigned int buffsize = 0;
char* buffout=NULL;
char* xmlresponse=NULL;
unsigned int buffoutsize = 1000;
int r = RL_API_STATUS(rl_api_initialise());
if (r == 0) {
buff = getdata();
//printf("Content-type: text/html\n\n Connection established %s",buff);
}
buffsize = (unsigned int) (size);
int s = RL_API_STATUS(rl_api_execute(buff,buffsize,(char**)(&buffout),&buffoutsize));
xmlresponse =(char *) malloc(buffoutsize);
strncpy (xmlresponse,buffout,buffoutsize);
xmlresponse[buffoutsize] = '\0';
//printf("Content-type: text/html\n\n Connection Established: %i Execute Command: %i XML Request: %s", r, s, xmlresponse);
printf("Content-type: text/xml\n\n %s", xmlresponse);
fp = fopen("log.txt", "w");
fprintf(fp,"Connection Established: %d\nExecution Status: %d\n",r,s);
fprintf(fp,"BufferIn: %s\nBufferInSize: %d\n", buff, buffsize);
fprintf(fp,"BufferOut: %s\nBufferOutSize: %d\n", buffout, buffoutsize);
//fprintf(fp,"XMLResponseOut: %s\n", xmlresponse);
fclose(fp);
}
LOG FILE welches geschrieben wird:
Connection Established: 0
Execution Status: 0
BufferIn: <?xml version="1.0" encoding="UTF-8"?><rl_api_cmd>get_information</rl_api_cmd>
BufferInSize: 78
BufferOut: <?xml version="1.0"?><api_information><api_version>R2004_01_28.5071</api_version><engine_version>2.10.5119</engine_version></api_information>
BufferOutSize: 141
BufferOutsize beinhalted hier die groesse(Laenge) von der XML Response.
Hoffe jemand hat nen kleinen Tip fuer mich!
Gruss
Philipp
Hallo,
Folgendes Szenario: Mein Webbrowser schickt XMLRequests an ein API und erhaelt dann als Antwort ein XML Dokument. Als Schnittstelle verwende ich das CGI. Fuer das senden der Requests verwende ich das AJAX Konzept. Das Problem ist nun, dass ich die responsexml kein Objekt enthaelt. D.h. der IE gibt die Fehlermeldung aus das das erhaltene Objekt null oder kein Objekt ist, und der FFox gibt die Fehlermeldung aus das die responsexml keine Properties hat.
Das ist jetzt eine quasi Doppelposting, aber du hast noch immer nicht gemacht, was ich dir beim letzen Mal vorgeschlagen habe: nämlich das ganze wirklich online zu stellen und nicht nur auf localhost.
Das letze Mal wies der Fehlemelung vom FF nämlich auf ein Sicherheitsproblem, was beim lokal <-> online auftreten kann, hin.
Grüße
Thomas
Das ist jetzt eine quasi Doppelposting, aber du hast noch immer nicht gemacht, was ich dir beim letzen Mal vorgeschlagen habe: nämlich das ganze wirklich online zu stellen und nicht nur auf localhost.
Das letze Mal wies der Fehlemelung vom FF nämlich auf ein Sicherheitsproblem, was beim lokal <-> online auftreten kann, hin.
Hallo THomas
Sorry dass ich mich dort nicht mehr gemeldet habe, aber es hat dann wirklich funktioniert wenn ich es vom lokalhost laufen lasse! Danke fuer diesen Hinweis. Nun hat es sich rausgestellt das ich eben responsexml anstatt responseXML verwendet habe ;) Witzig ist, dass die dem IE5.0 egal war, mit der 6er Version macht er jedoch das gleiche wie der Modzilla und liefert einfach kein Objekt zurueck!
BEsten dank nochmals
Philipp
Hallo
Ein kleines Update: In der Zwischenzeit erkennt mir das Javaskript das es sich beim eingehenden Objekt um ein XML Objekt handelt. Es war wirklich das Problem dass ich responsexml statt responseXML verwendet habe ;) Danke fuer den Hinweis
Leider funktioniert es aber immer noch nicht so richtig
response = http.responseXML.documentElement;
up_since =response.getElementsByTagName('up_since')[0].firstChild.data;
Ich versuche so den Wert von up_since rauszulesen, aber er gibt mit die Meldung aus
Error: response.getElementsByTagName("up_since")[0] has no properties
Source File: http://localhost/BabysteptestXML.htm
Line: 28
Obwohl mein XML Document so ausschaut: <?xml version="1.0"?><engine_status><up_since>1124357455</up_since><up_duration>16363</up_duration><connected_users>0</connected_users><active_users>0</active_users><allowed_users>1</allowed_users><verification_matrix><tr><td>sr</td><td>kj</td><td>bc</td><td>tg</td><td>pf</td></tr><tr><td>ph</td><td>gt</td><td>cq</td><td>fk</td><td>pk</td></tr><tr><td>hm</td><td>tc</td><td>rj</td><td>ee</td><td>tb</td></tr><tr><td>se</td><td>gs</td><td>fk</td><td>ag</td><td>hg</td></tr></verification_matrix><gateway_address>geldwolf2.trispen.com</gateway_address><company>trispen</company><admin_email></admin_email></engine_status>
Kann ich nix so wie oben auf das Element zugreifen?
Gruss
Philipp
Hallo,
Ein kleines Update: In der Zwischenzeit erkennt mir das Javaskript das es sich beim eingehenden Objekt um ein XML Objekt handelt. Es war wirklich das Problem dass ich responsexml statt responseXML verwendet habe ;) Danke fuer den Hinweis
Leider funktioniert es aber immer noch nicht so richtig
response = http.responseXML.documentElement;
up_since =response.getElementsByTagName('up_since')[0].firstChild.data;Ich versuche so den Wert von up_since rauszulesen, aber er gibt mit die Meldung aus
Versuche mit alert folgendes auszugeben (zumindest im FF sollte das gehen): alert(response.documentElement.nodeName). Dann weiss du zumindest was da falsch/nicht falsch ist.
Bzw. es sollte "firstChild.nodeValue" heissen.
Grüße
Thomas