Philipp: XMLHttpRequest Response generieren und verarbeiten

Hi wieder mal

Ich bin nun schon seit 2 Wochen dran ein Browserinterface fuer ein in C++ implementiertes API zu entwerfen. Wir verwenden dazu das Ajax Konzept. Im Moment sende ich einen XMLRequest an meine Anwendung, welche mir dann wiederum eine XMLResponse generiert. Als interface benutze ich CGI, ein kleines C Programm welches mir die Requests an die Anwendung weiterleitet und dann die Antwort an den Browser schickt. Das erhaltene XML Dokument parse ich dann mit Javascript. Soweit haut alles sehr gut hin!

Jedoch liefert mir die API zu dem XML Dokument noch zusaetzlich ein Statusflag. Dieses Flag beinhaltet verschiedene Informationen ob eine Operation erfolgreich war oder nicht usw. Wichtig ist mir dass mir dieses Statusflag auch irgendwie im Browser zur Verfuegung steht!
Im Moment schaut mein C Programm so aus:

int s = RL_API_STATUS(rl_api_execute(buff,buffsize,xmlresponse);
  printf("Content-type: text/xml\n\n%s", xmlresponse);

Ich moechte nun auch den Wert fuer s mit meiner Response mitschicken. Wie kann ich das am geschicktesten machen? Kann es nicht als zusatzliches Element in die xmlresponse aufnehmen, d.h. ich muss es irgendwie dranhaengen. Kann ich z.b nen String rausschreiben, dann den Wert fuer s aus dem String entfernen und den Rest des Strings auf ein XMLdocument casten?

Danke fuer hilfreiche Tips
Philipp

  1. Hi,

    printf("Content-type: text/xml\n\n%s", xmlresponse);

    das einzig gültige Zeilenendezeichen in HTTP-Headern ist CRLF, nicht nur LF.

    Ich moechte nun auch den Wert fuer s mit meiner Response mitschicken. Wie kann ich das am geschicktesten machen? Kann es nicht als zusatzliches Element in die xmlresponse aufnehmen, d.h. ich muss es irgendwie dranhaengen.

    Dann hast Du kein Wellformed XML mehr. Entweder fügst Du den Wert als gültiges XML _in_ Dein xmlresponse, oder Du nutzt einen HTTP-(X-)Header, wobei ich vermute, dass Du dies mit üblichen XmlHttpResponse-APIs nicht nutzen kannst. "Irgendwie dranhängen" ist nicht möglich.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. hi,

      Entweder fügst Du den Wert als gültiges XML _in_ Dein xmlresponse, oder Du nutzt einen HTTP-(X-)Header, wobei ich vermute, dass Du dies mit üblichen XmlHttpResponse-APIs nicht nutzen kannst.

      Warum nicht?
      sind die Methoden getAllResponseHeaders() bzw. getResponseHeader() nicht überall verfügbar?
      Ich habe derzeit keine Quelle zum Nachlesen an der Hand, meine mich aber aus eigenen Versuchen erinnern zu können, dass beide sowohl im IE, Gecko als auch Opera bei meinen diesbezüglichen Versuchen zur Verfügung standen - und auch HTTP-X-Header damit abfragbar waren.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hi,

        sind die Methoden getAllResponseHeaders() bzw. getResponseHeader() nicht überall verfügbar?

        keine Ahnung. Deswegen sagte ich ja auch, dass ich es vermute.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
    2. Hi

      Dann hast Du kein Wellformed XML mehr. Entweder fügst Du den Wert als gültiges XML _in_ Dein xmlresponse, oder Du nutzt einen HTTP-(X-)Header, wobei ich vermute, dass Du dies mit üblichen XmlHttpResponse-APIs nicht nutzen kannst. "Irgendwie dranhängen" ist nicht möglich.

      Danke fuer Deine schnelle Antwort. Wie gesagt wuerde die XML Response lieber so lassen wie sie im moment ist! Koenntest du mir vielleicht kruz die Idee mit dem HTTP-(X-)Header erklaeren. Sagt mir leider nix und auch Google findet nicht grade hilfreiche Sachen.

      Vielen Dank!
      Philipp

      1. hi,

        Koenntest du mir vielleicht kruz die Idee mit dem HTTP-(X-)Header erklaeren. Sagt mir leider nix und auch Google findet nicht grade hilfreiche Sachen.

        Neben den fest definierten HTTP-Headern darfst du auch eigene verwenden, die dann mit einem X- im Nmane anfangen - das von PHP defaultmässig mitgesendete X-Powered-By: PHP Version xy wäre ein beispiel.
        Einen solchen solltest du auch aus deinem C-Applikation heraus auslösen können (da aber mal selber Doku wühlen) - X-Philipp-Status: 4711.
        Und mit welchen Methoden des XMLHTTPRequest-Objektes dieser sich in Empfang nehmen bzw. auswerten lassen sollte, siehe mein anderes Posting.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Moin,

          X-Philipp-Status: 4711.

          An dieser Stelle _muss_ ich einfach auf http://www.nextthing.org/archives/2005/08/07/fun-with-http-headers verlinken.

          --
          Henryk Plötz
          Grüße aus Berlin
          ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
          ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~
  2. Hallo,

    Jedoch liefert mir die API zu dem XML Dokument noch zusaetzlich ein Statusflag.

    Wenn die HTTP Header aus was für Gründen auch immer sich nicht realisieren lassen, könntest Du überlegen, ob sich Dein Statusflag irgendwie in das bestehende System der HTTP Status-Codes einfügen lässt, dafür sind die Dinger doch da. Weitergehende Informationen könntest Du dann in die Reason Phrase packen. Der HTTP Standard erlaubt es auch, prinzipiell eigene Status-Codes zu definieren, wobei ich dann dabei darauf achten würde, bestehende Status-Codes nicht zu verletzen und mich sauber in das bestehende System (2xx für Erfolgreich, 3xx für Redirects, 4xx für Fehler) einzureichen. Im Javascript-Teil könntest Du dann auf diese Information mit den Eigenschaften status bzw. statusText des Request-Objektes zugreifen.

    Tim