Philipp: Problem mit xmlhttpRequest:

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

  1. 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

    1. 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

      1. 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

        1. 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....

          1. Hallo,

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

            gruss

            --
            no strict;
            no warnings;
            Meine Signatur hat Urlaub.
            1. 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

              --
              no strict;
              no warnings;
              Meine Signatur hat Urlaub.
            2. 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

              1. Hallo,

                was dem ie immer aufstösst (dem ff übrigens nicht), ist, wenn die Antwort nicht UTF-8 codiert ist.

                gruss

                --
                no strict;
                no warnings;
                Meine Signatur hat Urlaub.
      2. 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

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. 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

  2. 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

    1. 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

  3. 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

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. 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

  4. 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

    1. 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

      --
      Surftip: kennen Sie schon Pipolino's Clowntheater?
      http://www.clowntheater-pipolino.net/