Ajax Problem:laueft nur mit IE
Philipp
- barrierefreiheit
0 Cheatah0 Philipp0 wahsaga0 Philipp- javascript
0 Philipp0 Philipp1 Thomas J.S.
0 molily
Hallo
Folgende Problemstellung die es fuer mich zu loesen gibt: Ich soll ein HTML Interface implementieren, welches mir bei druecken eines buttons einen bestimmten XML Request an mein in C++ implementiertes API schicken soll. Um dies zu bewerkstelligen verwenden wir das Ajax Konzept. Ich habe nun ein sehr simples Testprogramm, welches mir einen Request runterschickt und den selben dann einfach wieder ausliest und dann in einem Textfeld ausgibt. Im Internetexplorer haut das einwandfrei hin, jedoch mit Firefox bekomme ich keine Rueckmeldung. Es tut sich rein gar nix. Eigentlich sollte ja das HTTPXMLREQUEST Objekt ident sein in beiden Faellen. Daher bin weiss ich nicht wo der Fehler liegen kann. Waere dankbar wenn ein Experte mir hier weiterhelfen koennte. Anbei Testcode vom HTML file sowie der CGI Applikation:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ZIP Code to City and State using XmlHttpRequest</title>
<script language="javascript" type="text/javascript">
var url = "http://localhost/cgi-bin/GetPost.exe"; // The server-side script
function handleHttpResponse() {
if (http.readyState == 4) {
//Split the comma delimited response into an array
//results = http.responseText.split(",");
//document.getElementById('city').value = results[0];
//document.getElementById('state').value = results[1];
document.getElementById('XMLRequest1').value = http.responseText;
}
}
function XMLRequest(request) {
http.open("POST", url, true);
//http.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
http.setRequestHeader("Content-Type", "text/xml");
http.onreadystatechange = handleHttpResponse;
//http.send("Test:" + zipValue);
//http.send("<?xml version='1.0' encoding='UTF-8'?>");
if (request == 0) {
http.send("<?xml version='1.0' encoding='UTF-8/16'?><rl_api_cmd>new_session</rl_api_cmd>");
}
else if (request == 1) {
http.send("<?xml version='1.0' encoding='UTF-8/16'?><rl_api_cmd>get_information</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;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>
</head>
<body>
<form action="post">
<p>
<input type="button" name="Verweis" value="New Session"
onClick="XMLRequest(0);"
</p>
<p>
<input type="button" name="Verweis1" value="Get Information"
onClick="XMLRequest(1);"
</p>
<p>Sent XML Request to API:<br>
<textarea name="XMLRequest1" cols="50" rows="10"></textarea>
</p>
</form>
</body>
</html>
/*
* Funktion liest Daten in der POST- oder GET-Methode ein.
* Rückgabewert: String puffer mit den Daten
* bei Fehler : NULL
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "rl_gw_api.h"
/*
* Da die Funktion strdup() in der Headerdatei <string.h> keine
* ANSI C-Funktion ist, schreiben wir eine eigene
*/
/*char *Strdup(const char *str)
{
char *p;
if(NULL == str)
return NULL;
else
{
p = malloc(strlen(str)+1);
if(NULL == p)
return NULL;
else
strcpy(p, str);
}
return p;
} */
unsigned long size;
char *getdata()
{
char *puffer = NULL;
char *request = getenv("REQUEST_METHOD");
char *cont_len;
if( NULL == request )
return NULL;
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 /* Keine POST-Methode wurde verwendet */
return NULL;
}
void main() {
char *buff = NULL;
unsigned int buffsize = (unsigned int) (size + 1);
char **buffout = NULL;
unsigned int *buffoutsize = NULL;
int r = RL_API_STATUS(rl_api_initialise());
if (r == 0) {
buff = getdata();
//printf("Content-type: text/html\n\n Connection established %s", buff);
}
int s = RL_API_STATUS(rl_api_execute(buff,buffsize,buffout,buffoutsize));
printf("Content-type: text/html\n\n Connection Established: %i Execute Command: %i XML Request: %s", r, s, buff);
}
VIelen Dank Philipp
Hi,
Folgende Problemstellung die es fuer mich zu loesen gibt: Ich soll ein HTML Interface implementieren, welches mir bei druecken eines buttons einen bestimmten XML Request an mein in C++ implementiertes API schicken soll. Um dies zu bewerkstelligen verwenden wir das Ajax Konzept.
da Du als Themenbereich schon "Barrierefreiheit" wählst: Die Abhängigkeit von einer optionalen Technik wie JavaScript ist _nicht_ barrierefrei.
jedoch mit Firefox bekomme ich keine Rueckmeldung. Es tut sich rein gar nix.
Spezifiziere "nix". Was sagt die JavaScript-Konsole, welcher Netzwerktraffic findet statt, was enthalten die einzelnen Objekte usw.
Anbei Testcode vom HTML file sowie der CGI Applikation:
Bitte reduziere Codes auf den relevanten Teil.
Cheatah
da Du als Themenbereich schon "Barrierefreiheit" wählst: Die »» Abhängigkeit von einer optionalen Technik wie JavaScript ist _nicht_ barrierefrei.
Sorry, dachte ich ordne es hier ein da ich nicht weiss ob dieses Problem im Javascriptbereich, CGI Bereich oder XML Bereich zu suchen ist!
Spezifiziere "nix". Was sagt die JavaScript-Konsole, welcher Netzwerktraffic findet statt, was enthalten die einzelnen Objekte usw.
Das http.responseText enthaelt keine Information. Das ist das Problem. Eigentlich heisst es ja das sich das XMLHTTPRequest bis auf die Instanzierung bei IE und Firefox gleich verhalten soll. Instanzierung gibt mir in beiden Faellen ein True zurueck, daher tue ich mir hier ein bisschen schwer mit der Fehlersuche!
Ich glaube das CGI Executable kann ausser acht gelassen werden. Das Problem muss woanders liegen. Ist naemlich das Executable nicht auffindbar retouniert mit der IE die entsprechende Fehlermeldung wahrend der Firefox wieder stumm ist.
Bitte reduziere Codes auf den relevanten Teil.
Okay hier nochmals das Ajax File, welches die Probleme verursacht
<script language="javascript" type="text/javascript">
var url = "http://localhost/cgi-bin/GetPost.exe";
function handleHttpResponse() {
if (http.readyState == 4) {
document.getElementById('XMLRequest1').value = http.responseText;
}
}
function 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/16'?><rl_api_cmd>new_session</rl_api_cmd>");
}
else if (request == 1) {
http.send("<?xml version='1.0' encoding='UTF-8/16'?><rl_api_cmd>get_information</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;
}
var http = getHTTPObject(); // We create the HTTP Object
</script>
</head>
<body>
<form action="post">
<p>
<input type="button" name="Verweis" value="New Session"
onClick="XMLRequest(0);"
</p>
<p>
<input type="button" name="Verweis1" value="Get Information"
onClick="XMLRequest(1);"
</p>
<p>Sent XML Request to API:<br>
<textarea name="XMLRequest1" cols="50" rows="10"></textarea>
</p>
</form>
hi,
Das http.responseText enthaelt keine Information.
zu welchem zeitpunkt?
function handleHttpResponse() {
if (http.readyState == 4) {
document.getElementById('XMLRequest1').value = http.responseText;
}
}
hast du überprüft, ob dein abfrageobjekt überhaupt bis zu dem punkt kommt, wo es den readyState 4 zurückliefern sollte?
vielleicht mal in dieser funktion einfach nur den readyState per alert ausgeben lassen, ohne if-abfrage - um zu sehen, ob auch erst mal 1 bis 3 "kommen" - oder ob sich deine handlerfunkion vielleicht einfach zu tode wartet, weil 4 nie eintritt ...?
gruß,
wahsaga
vielleicht mal in dieser funktion einfach nur den readyState per alert ausgeben lassen, ohne if-abfrage - um zu sehen, ob auch erst mal 1 bis 3 "kommen" - oder ob sich deine handlerfunkion vielleicht einfach zu tode wartet, weil 4 nie eintritt ...?
Ja du hast recht, es aendert sich schon gar nicht der readyState auf 1, d.h. es muss hier in Problem mit der handlerfunktion geben. Hat hier irgendwer eine Idee?
Danke
Philipp
Hallo wieder mal
Habe gerade einmal die Java Console vom Firefox angeschaut und bekomme folgende Fehlermeldung
Error: uncaught exception: Permission denied to call method XMLHttpRequest.open
Wie kann ich das hier umgehen?
Gruss
Philipp
Habe gerade einmal die Java Console vom Firefox angeschaut und bekomme folgende Fehlermeldung
Error: uncaught exception: Permission denied to call method XMLHttpRequest.open
Hi nochmals
Rufe nun die http.open Methode in einem try catch block auf, hilft jedoch auch nicht dieses Problem zu loesen. Kriege nun von der Java Console ueberhaupt keine Rueckmeldung! Waere dankbar wenn sich jemand mit einer Idee melden koennte
Gruss
Philipp
Hallo,
Habe gerade einmal die Java Console vom Firefox angeschaut und bekomme folgende Fehlermeldung
Error: uncaught exception: Permission denied to call method XMLHttpRequest.open
Wie kann ich das hier umgehen?
Das scheint aber ein Konflikt zwischen Domains zu sein, bzw. du versuchst von einer lokalen Datei (von deiner Festplatte) auf ein http:// URL zuzugreifen.
Versuche mal deine funktion einstweilen zu zu erweitern:
-------
function handleHttpResponse() {
var NetscapePrivilegXML = (url.substring(0,4) == "http") ? true : false;
if (http.readyState != 4) {
if (window.XMLHttpRequest && NetscapePrivilegXML) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
}
catch(fehler) {
document.getElementById('XMLRequest1').value = "Für diese Aktion sind erweiterte Zugriffe notwendig<br> Der Fehler ist: " + fehler + "!!";
return false;
}
}
else if(window.XMLHttpRequest && http.status != 200) {
alert(http.status + "\n" + http.statusText);
return false;
}
else {
document.getElementById('XMLRequest1').value = http.responseText;
}
}
-------------
Was passiert, wenn du alles Daten im Internet hast (also keine localhost etc.)?
Grüße
Thomas
Hi,
Der Code funktioniert bei mir an sich und erreicht auch bei mir (Firefox l.0.6) den readyState 4, responseText ist auch gefüllt. Ich habe allerdings mit einer statischen Datei anstatt dem CGI-Programm getestet (kann kein C - sehe darin aber soweit keinen Fehler). Hier gibts einen kleinen Fehler:
document.getElementById('XMLRequest1').value = http.responseText;
<textarea name="XMLRequest1" cols="50" rows="10"></textarea>
Mit getElementById kannst du nicht auf Elemente mit name-Attribut zugreifen, das geht nur im IE aufgrund eines Bugs. Gibt man der textarea eine entsprechende id="XMLRequest1", dann sollte es laufen.
M.
Der Code funktioniert bei mir an sich und erreicht auch bei mir (Firefox l.0.6) den readyState 4, responseText ist auch gefüllt. Ich habe allerdings mit einer statischen Datei anstatt dem CGI-Programm getestet (kann kein C - sehe darin aber soweit keinen Fehler). Hier gibts einen kleinen Fehler:
document.getElementById('XMLRequest1').value = http.responseText;
<textarea name="XMLRequest1" cols="50" rows="10"></textarea>
Mit getElementById kannst du nicht auf Elemente mit name-Attribut zugreifen, das geht nur im IE aufgrund eines Bugs. Gibt man der textarea eine entsprechende id="XMLRequest1", dann sollte es laufen.
Danke fuer Deine Antwort aber wie gesagt bei mir haut das ganze nicht hin, obwohl ich grade meinen Firefox geupdated habe.
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6
Kann das vielleicht irgendwie an den Sicherheitseinstellungen liegen? Habe das name auf ID geaendert, danke fuer den Hinweis!
Gruss
Philipp