Toon posts:

[PHP] HTTP posten i.s.m. SOAP

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een SOAP server, ik wil deze benaderen met een PHP client. De werking is heel basic en ik wil graag werken via de w3 soap standaarden. Het is me tot nu toe nog niet gelukt om met php een ruwe http header te posten en de reactie van de server te ontvangen. Ik heb NUSOAP en phpsoaptoolkit uitgeprobeerd maar ik was over beide niet tevreden. Ik wil graag mijn soapbericht zelf opmaken.

als voorbeeld zou de http post er ongeveer zo uitmoeten zien:

POST localhost HTTP/1.1
Content type: application/x-www-form-urlencoded
SOAPAction: Simple Server

<SOAP:Envelope xmlns:SOAP="http://www.w3.org/2001/12/soap-envelope"
SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<var>1</var>
</SOAP:Body>
</SOAP:Envelope>

Ik werk met een content type x-www-form-urlencoded omdat anders de server het soapbericht niet kan ontvangen. Ik heb het werkend gekregen met ASP doormiddel van het object XMLHTTP.

Weet iemand hoe ik dit kan doen met php?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Je kunt toch gewoon een socket read/write naar de server openen? En de raw request naar die filepointer schrijven?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Ik heb het gelezen, maar iedere keer als ik fsockopen gebruik dan krijg ik deze foutmelding:

Fatal error: Maximum execution time of 30 seconds exceeded in \php\simpleclient.php on line 24

en dit is de code die ik gebruik:

$errno = "1";
$errstr = "Het openen van een socket gaat fout";
$fp = fsockopen ("127.0.0.1", 80, $errno, $errstr, 5);
if (!$fp) echo $errstr($errno)."<br />\n";
fclose($fp);

  • yade
  • Registratie: Mei 2002
  • Laatst online: 25-11-2025
Op die poort draait de webserver waarschijnlijk al. Je moet een andere (vrije) poort kiezen.

Verwijderd

Deze code werkt gewoon hoor:

code:
1
2
3
4
5
6
7
8
9
10
$errno = "1";
$errstr = "Het openen van een socket gaat fout";
$fp = fsockopen ("127.0.0.1", 80, $errno, $errstr, 5);
if (!$fp) echo $errstr($errno)."<br />\n";
fputs ($fp, "GET / HTTP/1.0\r\n\r\n");

while (!feof($fp)) {
    echo fgets ($fp,128);
}
fclose($fp);


maximum execution time exceeded van 30 sec betekent dat je dus ergens in je script een blocking method aanroept die langer dan 30 seconden bezig is.

kijk vooral ook naar socket_set_blocking.

Taoufik

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
taoufik: Die groeten kun je achterwege laten :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
yade schreef op 23 oktober 2002 @ 10:31:
Op die poort draait de webserver waarschijnlijk al. Je moet een andere (vrije) poort kiezen.
dit is het inderdaad, stom van me, maar ik heb er niet aan gedacht, heb nu het bestand vanaf mijn linux servertje laten lopen en dan werkt het wel.
met fput kan ik nu mijn gegevens oversturen

bedankt

Verwijderd

Topicstarter
Ik ben al flink tijdje bezig en het werken via fsockopen werkt ook. ik krijg alleen geen content via HTTP verstuurd. Mijn code is :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$msg = "<SOAP:Envelope xmlns:SOAP=\"http://www.w3.org/2001/12/soap-envelope\" SOAP:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n".
    "<SOAP:Header></SOAP:Header>\n".
    "<SOAP:Body>\n".
    "<var>1</var>\n".
    "</SOAP:Body>\n".
    "</SOAP:Envelope>\n";   

$httpheader =   "POST /server/simpleserver.cfm HTTP/1.0\r\n".
        "Host: 10.0.0.120\r\n".
        "Content Length:".strlen($msg)."\r\n".
        "Connection: Keep-Alive\r\n".
        "Accept:*/*\r\n".
        "Pragma:no-cache\r\n".
        "Content type: application/x-www-form-urlencoded\r\n".
        "SOAPAction: Simple Server\r\n\r\n".
        $msg;       

$errno = "1";
$errstr = "Het openen van een socket gaat fout";
$fp = fsockopen ("10.0.0.120", 80, $errno, $errstr, 10);
if (!$fp) echo $errstr($errno)."<br />\n";
fputs ($fp, $httpheader, strlen($httpheader));
echo fread($fp,32768);
fclose($fp);

Ik krijg vang alles af, en alle http headers krijg ik keurig binnen, maar geen content. Als ik de variabele $msg als een header meegeef, geeft hij het wel door, maar niet op je juiste manier. dit is dus geen optie

  • sjokki
  • Registratie: Juli 2002
  • Niet online
Als je x-www-form-urlencoded gebruikt moet je ook urlencoden. En je moet het in deze vorm doen:

var1=waarde1&var2=waarde2

Verwijderd

Topicstarter
dat klopt, maar je kan ook gewoon content meegeven, en deze via xmldom benaderen, is makkelijker. het liefst zou ik text/xml als content type gebruiken, maar dan werkt coldfusion mx niet, en daarmee is mijn soap server gemaakt.

de post voordat hij verstuurd wordt, dus $httpheader:

---------------------------------------------------------------------

POST /server/simpleserver.cfm HTTP/1.0
Host: 10.0.0.120
Content Length:215
Connection: Keep-Alive
Accept:*/*
Pragma:no-cache
Content type: application/x-www-form-urlencoded
SOAPAction: Simple Server

<SOAP:Envelope xmlns:SOAP="http://www.w3.org/2001/12/soap-envelope" SOAP:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP:Header></SOAP:Header>
<SOAP:Body>
<var>1</var>
</SOAP:Body>
</SOAP:Envelope>

-------------------------------------------------------------------------

De hele header vang ik af, maar het bericht eronde, de content, krijg ik niet binnen

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Je kunt dit ook met de MS SOAP Toolkit van Microsoft doen. Je moet deze dan downloaden van de Microsoft site.
Voorbeeldje van MS SOAP Toolkit gebruiken met PHP (ik gebruik hier MS SOAP Toolkit versie 3):
PHP:
1
2
3
4
5
$soapClient = new COM("MSSOAP.SoapClient30");
$soapClient->MSSoapInit("http://someserver/somewsdl.wsdl");
$someResult = $soapClient->SomeFunction(someParams);
$soapClient->Release();
unset($soapClient);

Uitgebreide documentatie over het gebruik van de MS SOAP Toolkit objecten is bijgeleverd.

linkje: MS SOAP Toolkit download

  • sjokki
  • Registratie: Juli 2002
  • Niet online
Als het met ASP wel werkt en met PHP niet dan zijn de HTTP-requests blijkbaar niet exact hetzelfde. Je kan met Ethereal oid kijken waarin de requests van elkaar verschillen en dan zorgen dat die van PHP wel hetzelfde is als die van ASP.

Verwijderd

Topicstarter
ethereal ? ken ik niet ga het even uitproberen, mssoaptoolkit heb ik ook, maar wil zelf de soap code in de hand hebben eigenlijk.

Ik heb het bekeken, maar kan juist geen HTTP protocol opvangen, wel smtp en nog 1000 andere, maar http niet.

  • Wortelpudding
  • Registratie: Februari 2002
  • Niet online
Je kunt met de low-level API van ms soap toolkit ook zelf soap-requests composen...

  • stylee
  • Registratie: December 2000
  • Laatst online: 04-09-2021

stylee

blah zeg ik je

Mischien heb je hier iets aan:

http://phpsoaptoolkit.sourceforge.net/phpsoap/

Verwijderd

Topicstarter
Dit heb ik al gebruikt, maar tot geen voldoening, het is handig als je aan beide kanten de phpsoaptoolkit gebruikt, maar om te werken met een coldfusion server is het wat lastiger.

Verwijderd

Topicstarter
[quote]Wortelpudding schreef op 23 oktober 2002 @ 16:01:
Je kunt dit ook met de MS SOAP Toolkit van Microsoft doen. Je moet deze dan downloaden van de Microsoft site.
Voorbeeldje van MS SOAP Toolkit gebruiken met PHP (ik gebruik hier MS SOAP Toolkit versie 3):[/qoute]

Ik moet het ook op een linux platform kunnen gebruiken, dus de mssoap toolkit valt ook af. Het liefst heb ik het hele proces in eigen hand, en schrijf ik mijn eigen soap objectje in php, het afvangen en structureren is niet moeilijk, mijn probleem zit puur in het verzenden en ontvangen tussen client server.

Ik hoop dat iemand ervaring heeft met verzenden via fputs.

Verwijderd

Topicstarter
ik heb even gebruik gemaakt van $GLOBALS["HTTP_RAW_POST_DATA"]. Als ik een soap message stuur met php dan ontvang ik niets, met asp pakt hij keurig de data. Hiermee kan ik alleen concluderen dat het aan php ligt en niet aan de ontvangst bij de server.

  • sjokki
  • Registratie: Juli 2002
  • Niet online
Verwijderd schreef op 23 oktober 2002 @ 16:15:
ethereal ? ken ik niet ga het even uitproberen, mssoaptoolkit heb ik ook, maar wil zelf de soap code in de hand hebben eigenlijk.

Ik heb het bekeken, maar kan juist geen HTTP protocol opvangen, wel smtp en nog 1000 andere, maar http niet.
Even snel een kleine handleiding:

- Start Ethereal
- Kies Capture->Start (Ctl K)
- Kies bij interface 'lo' of 'any' (voor local)
- Vul bij Filter 'port 80' in (of een andere poort)
- Druk op 'OK', doe de request en druk dan op 'Stop'
- Klik met rechtermuisknop op een regel in de capture-data en kies 'Follow TCP Stream'

Dan zie je zoiets: http://members.home.nl/sjokki/ethereal.png

Verwijderd

Topicstarter
sjokki schreef op 24 oktober 2002 @ 13:18:
[...]

Even snel een kleine handleiding:

- Start Ethereal
- Kies Capture->Start (Ctl K)
- Kies bij interface 'lo' of 'any' (voor local)
- Vul bij Filter 'port 80' in (of een andere poort)
- Druk op 'OK', doe de request en druk dan op 'Stop'
- Klik met rechtermuisknop op een regel in de capture-data en kies 'Follow TCP Stream'

Dan zie je zoiets: http://members.home.nl/sjokki/ethereal.png
Jep ik ben er ook achter gekomen :) heb het ook werkend gekregen maar bedankt in ieder geval. Het is trouwens bij filter : portmap.port == 80

Verwijderd

Nusoap is een soap-driver geschreven in php die je gewoon kan gebruiken (Gratis). Werkt echt super-simpel, met werkend voorbeeldje in readme.txt
Download van http://dietrich.ganx4.com/nusoap/index.php

Verwijderd

Topicstarter
Ik heb inmiddels een eigen object geschreven, en die lijkt heel erg op die van nusoap, alleen ik heb het hele SCHEMAS van xml eruit gelaten, ik wil alleen maar mijn handgemaakte soapberichte overkrijgen, het werkt beter dan eerst, ik kan vang nu in php de content op. in asp en coldfusion krijg ik het nog niet opgevangen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class HTTP_Client 
{ 
var $host; 
var $port; 
var $socket; 
var $errno ; 
var $errstr; 
var $timeout; 
var $buf; 
var $result; 
var $post_data; 
var $path; 
var $path = "/"; 
var $msg;


function HTTP_Client($host, $port, $timeout) 
{ 
$this->host = $host; 
$this->port = $port; 
$this->timeout = $timeout; 
} 


function connect() 
{ 

$this->socket = fsockopen($this->host, 
$this->port, 
$this->errno, 
$this->errstr, 
$this->timeout 
); 

if(!$this->socket) 
    {return false; }
else 
    {return true; }
} 


function set_path($path) 
{ 
$this->path = $path; 
} 


function send_request() 
{ 

if(!$this->connect()) 
{ 
    return false; 
} 
else 
{ 
    $this->result = $this->request($this->post_data); 
    return $this->result; 
} 
} 

function request($post_data) 
{ 

$this->buf = ""; 

$this->msg = "POST $this->path HTTP/1.0\r\n". 
"Host:$this->host\r\n". 
"Content-Type: application/xml; charset=UTF-8   \r\n". 
"Content-Length: ".strlen($post_data)."\r\n". 
"SOAPAction: simple server".
"\r\n". 
"\r\n".$post_data. 
"\r\n"; 

fwrite($this->socket, $this->msg); 

$this->buf = fread($this->socket, 1000000); 
$this->close(); 
return $this->buf; 
} 

function close() 
{ 
fclose($this->socket); 
} 
} 



$soapclient = new HTTP_Client('10.0.0.120',80,5);
$soapclient->set_path("/server/simpleserver.cfm");
$soapclient->post_data = "<test>test</test>";
echo $soapclient->send_request();


Dit is mijn object en het verzenden e.d. werkt gewoon. Ik heb inmiddels met ethereal de streams opgevangen. Ik kan alleen vanaf mijn ethernet kaart streams afvangen, en hierdoor de php http post, maar ik kan niet vanaf localhost afvangen, heel vervelend. ik kan dus niet vergelijken.

Trouwens goed programma, ethereal, je kan er zeer veel aan hebben.

Verwijderd

Topicstarter
Nou het probleem is opgelost, wat heb ik gedaan. Ik heb de NuSOAP 0.6.1 gepakt. Deze bevat nog een groot aantal fouten, ik heb het hele wsdl gedeelte eruit gesloopt, heb mijn eigen soap parser erin gebouwt. De attributen die aangeroept worden veranderd. NuSOAP houdt rekening met een proxy, ik denk dat daardoor de problemen kwamen.

Ik hoop dat er snel een nieuwe SOAP proxy voor php komt want de huidige zijn nog lang niet goed. Ik geloof met de nieuwe php 4.3 er een flinke verbetering komt met xml ondersteuning en een nieuwe functie "proc_open" die een groot deel van de problemen zal weghalen.

Als iemand nog betere ideeen of tips heeft hoor ik die graag natuurlijk
Pagina: 1