Clanintern Clanintern Clanintern

Forum

Öffentliche Foren
FORUM: Spiele & Computer THEMA: [A] SOAP Request erzeugen
AUTOR BEITRAG
Ged

RANG Prophet of Clanintern

#1 - 10.12 15:43

ich stelle mich gerade ziemlich dämlich an

ich möchte einen Webservice via SOAP ansprechen
was mir klar ist, daß das ganze über einen POST Request läuft
was mir aber nicht klar ist:
bei einem konventionellen POST Request aus einem Formular heraus hat ja jedes Datenfeld einen Bezeichner
code:
<input type="test" name="postleitzahl">


bei der Doku zu dem Webservice habe ich aber keine Angabe, wie dieses Datenfeld bezeichnet ist
weil ich auch nirgendswo etwas dazu gefunden habe, gehe ich davon aus, daß es hier nicht wie bei einem konventionellem POST Request läuft
nu die große Frage: wie mache ich es dann?
hat jemand evtl. ein simples Beispiel?
*al!ve* - will code for food

RANG Master of Clanintern

#2 - 10.12 21:39

Du musst das anders angehen. Die Betrachtung als POST-Request ist bei SOAP nämlich eher falsch.

Sieh den Request als Socket-Kommunikation. Der Client macht einen TCP-Socket zum Server auf, schickt einen HTTP-Header hin und bekommt als Antwort einen HTTP-Header, eine Leerzeile und dann in irgend einer Form Nutzdaten.

Du kennst den normalen GET-Qerry-String? index.php?vara=x&varb=y&varc=z?

Der HTTP-Request des Clients dazu sieht so aus:
code:
GET /index.php?vara=x&varb=y&varc=z HTTP/1.1
Host: meine.domain.foo


Die Leerzeile am Ende ist notwendig damit der Server erkennt: "Hier ist der Request zu Ende".

POST funktioniert im Prinzip genauso, nur dass "vara=x&varb=y&varc=z" als Nutzdaten nachgeschoben werden:
code:
POST /index.php HTTP/1.1
Host: meine.domain.foo
Content-Length:20

vara=x&varb=y&varc=z


Wie hier zu sehen ist, sind die die Variablen enthaltenden Querry-Strings bei GET und POST identisch, nur dass sie bei GET am Dateinamen hängen, bei Post stattdessen nachgelagert.

Content-Length ist die Anzahl der Zeichen des Nutzdatenbereichs.


www.w3.org/TR/2007/REC-soap12-part0-20070427/#L26866
Hier ist ein Beispiel wie SOAP-Requests ablaufen. Hier wird ein POST-Request abgesetzt, der Nutzdatenbereich ist allerdings nicht mit einem Querry-String nach GET oder POST gefüllt sondern einem XML-String.


Du kannst/darfst also nicht einfach dein XML in eine Variable oder ein Formularfeld packen sondern musst zwingend einen extra Socket dafür aufmachen und entsprechend formulieren.
Ged

RANG Prophet of Clanintern

#3 - 11.12 12:43

danke für die (endlich verständliche) erklärung

das ganze sollte ich (wenn ich mit PHP arbeiten möchte) mit den socket funktionen abbilden können, oder?

edit:
"scheint" zu funzen
wieso nur zum schein: ich bekomme keine response vom server
beim request muß ich nen user & passwort mit angeben, übermittle ich da was falsches, bekomme ich immerhin ein "non authorized user" zurück, also scheint das mit dem request an sich zu klappen

danke²

edit²:
liegt am server, hab mal nen test an nen öffentlichen soap service gemacht, da funzt es wunderbar :-)

so sieht das ding (für den öffentlichen service) aus:
code:
<?php

$fp = @fsockopen("www.moral-politics.com", 80, $errno, $errstr);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {


$soap_data = '<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <DrawDistribution xmlns="http://www.moral-politics.com/">
      <Language>USEnglish</Language>
      <Size>10</Size>
    </DrawDistribution>
  </soap12:Body>
</soap12:Envelope>';

$soap_out  = "POST /xPolitics.asmx HTTP/1.1\r\n";
$soap_out .= "Host: www.moral-politics.com\r\n";
$soap_out .= "Content-Type: application/soap+xml; charset=utf-8\r\n";
$soap_out .= "Content-Length: " . strlen($soap_data) . "\r\n";
$soap_out .= "\r\n";
$soap_out .= $soap_data;

fputs($fp, $soap_out, strlen($soap_out));  // send request SOAP
    echo "<xmp>".$soap_out."</xmp>";

echo '<xmp>';   //display response SOAP
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
echo '</xmp>';

    fclose($fp);
}
?>


kritiken / tips sind willkommen
*al!ve* - will code for food

RANG Master of Clanintern

#4 - 12.12 18:47

Der \r ist hier Quark.

Vor einigen Jahrzehnten hatte mal quasi ausschließlich Plaintext, der bestenfalls auf nem Nadeldrucker gedruckt wurde. Der Nadeldrucker hat nen Kopf der in einem Zug von links nach rechts eine Schriftzeile druckt, danach muss er zurück zur Ausgangsposition, links auf Anschlag. Der \r hat genau diese Funktion: Kopf nach links. Im Windowsbereich hat sich eingebürgert, den \r mit in die Textdateien zu stecken, dann konnte man den Textdateiinhalt ohne Änderungen zum Druckertreiber pipen. Im Unixbereich hat sich eingebürgert, den Druckertreiber diese Aufgabe übernehmen zu lassen, weshalb hier der \r in der Regel nicht an jedem Zeilenende steht.

Im Bereich der Socketkommunikation hat der \r nun absolut keine Daseinsberechtigung mehr. Der \n ist hier auch nicht als "new line" zu sehen sondern meistens als "end of command".

Lass den \r also weg .


Wie das mit deiner Authentifizierung funktioniert, hängt von deinem Protokoll ab. Ich könnte mir auch vorstellen, das du dich erst mit Benutzername und Passwort authentifizieren musst und dir der Server als Response dann nen Session-Key liefert, den du anschließend bei der eigentlichen Nutzdatenabfrage mitschicken musst.
Ged

RANG Prophet of Clanintern

#5 - 15.12 09:56

quote:
Lass den \r also weg

okay

authentifizierung:
wird in meinem fall im header des SOAP requests übergeben
dat funzt mittlerweile auch mit response