[PHP][SOAP] wsdlfilename.php ipv wsdlfilename.wsdl mogelijk?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn vraag heeft betrekking tot de ingebouwde SOAP van PHP. Ik heb een soapClient, een wsdl file en een soapserver. Dit werkt allemaal prima.
Om deze opstelling wat generieker te maken, lees: om het ook voor andere toepassingen te kunnen gebruiken wordt mijn wsdl file variabel. De locatie die aangeeft waar de soapserver staat zal per applicatie verschillend zijn.

Nu dacht ik, ik maak er een php file van, mywsdlfile.php die een string returnt van wat eigenlijk de oorspronkelijke wsdlfile was.

Mijn probleem nu: de soapClient kan geen instantie maken van een phpfile. Wat is een goede manier om dit op te lossen, of anders aan te pakken?

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
stuur je wel de goede headers?

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Controleer inderdaad of je de headers goed meestuurt. Maar ik denk dat je het probleem met mod_rewrite kan oplossen (als je apache gebruikt)

RewriteEngine On
RewriteRule ^wsdlfilename.wsdl$ /script.php

Zoiets in je .htaccess of httpd.conf


Succes!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je bedoelt omdat het een php file is, toch wsdl headers sturen?

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Verwijderd schreef op woensdag 27 december 2006 @ 13:32:
Je bedoelt omdat het een php file is, toch wsdl headers sturen?
Ik denk dat je gewoon xml headers moet sturen..
header("Content-type: text/xml"); zoiets.. als het echt het URL is wat niet geaccepteerd wordt dan gebruik je mod rewrite.

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 21:10

pietje63

RTFM

Ik heb hier niet zo veel ervaring mee hoor, maar wordt zo'n bestand niet lokaal opgeroepen (en dus niet via apache/php) waardoor het verkeerd gaat?

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bestand komt bij de server te staan zodat elke client van dát wsdl bestand gebruik kunnen maken. Maar aangezien er meerdere servers zullen komen op verschillende plaatsen, wil ik de wsdl file variabel kunnen maken aan zijn locatie, wat betekend dat een aantal dingen zoals soapserver:location afhankelijk gaan worden van waar het zaakje staat. Dit kan ik met php natuurlijk invullen, geen probleem. Alleen willen mijn clientjes het filetje dan niet meer slikken omdat het een php file geworden is..

Acties:
  • 0 Henk 'm!

  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 21:10

pietje63

RTFM

Okay.. En een oud trucje als mywsdlfile.php?extensie=.wsdl zodat het toch een andere extensie ijkt te hebben al geprobeerd

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


Acties:
  • 0 Henk 'm!

Verwijderd

pietje63 schreef op woensdag 27 december 2006 @ 15:29:
Okay.. En een oud trucje als mywsdlfile.php?extensie=.wsdl zodat het toch een andere extensie ijkt te hebben al geprobeerd
Dat is net zo smerig als de nutteloze php (het is immers doorgaans geen php) extensie. Gebruik dan de eerder genoemde rewrite rule. Dat is eigenlijk de enige galante oplossing.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee ook dat werkt niet. Hij slikt echt gewoon geen php files. Ik vraag me af hoe een ander dit oplost, want ik neem aan dat ik niet de enige ben die hier tegenaan loopt?

Kún je met je client een php file aanroepen die een wsdl file returnt, in plaats van de wsdl direct?

k heb ook al geprobeerd om php op te nemen in die myfile.wsdl maar ook dat werkt niet.

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Verwijderd schreef op woensdag 27 december 2006 @ 14:04:
Bestand komt bij de server te staan zodat elke client van dát wsdl bestand gebruik kunnen maken. Maar aangezien er meerdere servers zullen komen op verschillende plaatsen, wil ik de wsdl file variabel kunnen maken aan zijn locatie, wat betekend dat een aantal dingen zoals soapserver:location afhankelijk gaan worden van waar het zaakje staat. Dit kan ik met php natuurlijk invullen, geen probleem. Alleen willen mijn clientjes het filetje dan niet meer slikken omdat het een php file geworden is..
Stuur header Content-type uit zoals hierboven omschreven. Ik denk dat de clients daar last van hebben, als je gewoon php doet wordt het text/html en dan gaat het fout.

Dusss...
-----
<? // mijn php file letop geen spaties of lege regels voor deze regel
header("Content-type: text/xml");
? >
Mijn hele WDSL verhaal
location:<? echo "mijn dynamische locatie";?>
De rest van mijn WDSL verhaal.
------

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
<?
header("Content-type: text/xml");
?>

 <?xml version='1.0' encoding='UTF-8' ?>

  <definitions name='TestResultCollector' 
    targetNamespace='<? echo "http://myserver/mylocation" ?>/wsdl.php'
en dan vooral deze regel natuurlijk:
code:
1
<soap:address location=


Ook zo slikt hij em niet. Maak ik er een wsdl.wsdl (of whatever.wsdl) van, en haal de php code weg, dan doet ie het als een tierelier..

[ Voor 9% gewijzigd door Verwijderd op 27-12-2006 16:14 ]


Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Verwijderd schreef op woensdag 27 december 2006 @ 16:13:
code:
1
2
3
4
5
6
7
8
<?
header("Content-type: text/xml");
?>

 <?xml version='1.0' encoding='UTF-8' ?>

  <definitions name='TestResultCollector' 
    targetNamespace='<? echo "http://myserver/mylocation" ?>/wsdl.php'
en dan vooral deze regel natuurlijk:
code:
1
<soap:address location=


Ook zo slikt hij em niet. Maak ik er een wsdl.wsdl (of whatever.wsdl) van, en haal de php code weg, dan doet ie het als een tierelier..
De XML/php masters ontdekten al aan het einde van de vorige eeuw dat <?xml ..... UTF-8?> ook door php wordt geparsed ;) vanwege de "<?"

volgens mij kan je die regel vervangen door:
<? echo "<"."?xml version='1.0' encoding='UTF-8' ?".">";?>

je moet de url's (wsdl en php) eens in je browser zetten en goed kijken of je nog verschillen ziet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja k had het al gezien, aangepast etc. maar allemaal geen enkele zin.. ik vrees dat ik toch voor een andere oplossing zal moeten gaan. dus van te voren de wsdl genereren, ergens neergooien en vanaf daar gewoon direct benaderen ofzo..

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Verwijderd schreef op woensdag 27 december 2006 @ 16:44:
Ja k had het al gezien, aangepast etc. maar allemaal geen enkele zin.. ik vrees dat ik toch voor een andere oplossing zal moeten gaan. dus van te voren de wsdl genereren, ergens neergooien en vanaf daar gewoon direct benaderen ofzo..
Geef je nu al op? ;) Anyway, succes ermee!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haha, nouja, ik vrees dat het op deze manier gewoon niet kan eigenlijk. En dan moet je toch aan andere oplossingen gaan denken natuurlijk om verder te komen. Maar tips en tricks zijn altijd van harte welkom!

Bedankt!

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
Verwijderd schreef op woensdag 27 december 2006 @ 17:12:
Haha, nouja, ik vrees dat het op deze manier gewoon niet kan eigenlijk. En dan moet je toch aan andere oplossingen gaan denken natuurlijk om verder te komen. Maar tips en tricks zijn altijd van harte welkom!

Bedankt!
Ik weet wel zeker dat het kan.. je kan php scripts namelijk voor vanalles gebruiken.. zelfs jpg of mp3, oorzaak nummero uno als een bepaalde browser, telefoon, applicatie of andersoortige client het niet 'slikt' is mime/content type.. En de zeldzame gevallen die dan ook nog over het url zeuren kan je oplossen door een url rewrite.

Maar let wel.. je moet wel exact weten wat je doet.. zo zag ik al in je code de xml definitie op de tweede regel staan. Dit kan al tot problemen leiden, het is niet zo dat je een bestandje 'even' kan renamen naar php en klaar is kees.

Misschien kan je dit eens proberen:

<?
headers("Content-type: text/xml");

$data = getfilecontents("abcdef.wsdl");

print $data;
?>

eerst even testen met de normale wdsl file, als dat werkt zet je boven de print $data nog :
$data =str_replace("_LOCATIE_","http://echtelocatie.nl/daar/hier/",$data);
even de wdsl aanpassen en _LOCATIE_ op de juiste plek zetten en klaar is kees. (hopelijk)

[ Voor 18% gewijzigd door jnr24 op 27-12-2006 18:36 ]


Verwijderd

Topicstarter
Bedankt voor je reactie!
Op onderstaande manier slikt hij wel netjes de wsdl.php file.
XML:
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
<?php
header("Content-type: text/xml");
echo "<"."?xml version='1.0' encoding='UTF-8' ?".">";
$me = $_SERVER['PHP_SELF'];
$Apathweb = explode("/", $me);
$myFileName = array_pop($Apathweb);
$pathweb = implode("/", $Apathweb);
$location = "http://".$_SERVER['HTTP_HOST'].$pathweb; 
?>
<definitions name='TestResultCollector' 
  targetNamespace=''http://mylocation/mypath/wsdl.php' 
  xmlns:tns=''http://mylocation/mypath/wsdl.php' 
  xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
  xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' 
  xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' 
  xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' 
  xmlns='http://schemas.xmlsoap.org/wsdl/'>
  
 <message name='setresultsRequest'>
  <part name='platform' type='xsd:array'/>
  <part name='instance' type='xsd:array'/>
  <part name='results' type='xsd:array'/>
 </message>
 <message name='setresultsResponse'>
  <part name='result' type='xsd:string'/>
 </message>
  
 <portType name='TestResultCollectorPortType'>
  <operation name='setresults'>
   <input message='tns:setresultsRequest'/>
   <output message='tns:setresultsResponse'/>
  </operation>
 </portType>
  
 <binding name='TestResultCollectorBinding' type='tns:TestResultCollectorPortType'>
  <soap:binding style='rpc' 
    transport='http://schemas.xmlsoap.org/soap/http'/>
  <operation name='setresults'>
   <soap:operation soapAction='urn:localhost-TestResultCollectorAction#setresults'/>
   <input>
    <soap:body namespace='urn:localhost-TestResultCollectorAction' 
      use='encoded' 
      encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
   </input>
   <output>
    <soap:body namespace='urn:localhost-TestResultCollectorAction' 
      use='encoded' 
      encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
   </output>
  </operation>
 </binding>
  
 <service name='TestResultCollectorService'>
  <port name='TestResultCollectorPort' binding='TestResultCollectorBinding'>
   <soap:address location='http://mylocation/mypath/soapserver.php'/>
  </port>
 </service>
 
</definitions>


Vervang ik de harde locatie door <? echo $location; ?> krijg ik een WSDL parse error.

Op de volgende manier ook dezelfde parse error:
XML:
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
<?php
header("Content-type: text/xml");
echo "<"."?xml version='1.0' encoding='UTF-8' ?".">";
$me = $_SERVER['PHP_SELF'];
$Apathweb = explode("/", $me);
$myFileName = array_pop($Apathweb);
$pathweb = implode("/", $Apathweb);
$location = "http://".$_SERVER['HTTP_HOST'].$pathweb; 
echo "
<definitions name='TestResultCollector' 
  targetNamespace='http://myserver/mylocation/wsdl.php' 
  xmlns:tns='http://myserver/mylocation/wsdl.php' 
  xmlns:xsd='http://www.w3.org/2001/XMLSchema' 
  xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' 
  xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' 
  xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' 
  xmlns='http://schemas.xmlsoap.org/wsdl/'>
  
 <message name='setresultsRequest'>
  <part name='platform' type='xsd:array'/>
  <part name='instance' type='xsd:array'/>
  <part name='results' type='xsd:array'/>
 </message>
 <message name='setresultsResponse'>
  <part name='result' type='xsd:string'/>
 </message>
  
 <portType name='TestResultCollectorPortType'>
  <operation name='setresults'>
   <input message='tns:setresultsRequest'/>
   <output message='tns:setresultsResponse'/>
  </operation>
 </portType>
  
 <binding name='TestResultCollectorBinding' type='tns:TestResultCollectorPortType'>
  <soap:binding style='rpc' 
    transport='http://schemas.xmlsoap.org/soap/http'/>
  <operation name='setresults'>
   <soap:operation soapAction='urn:localhost-TestResultCollectorAction#setresults'/>
   <input>
    <soap:body namespace='urn:localhost-TestResultCollectorAction' 
      use='encoded' 
      encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
   </input>
   <output>
    <soap:body namespace='urn:localhost-TestResultCollectorAction' 
      use='encoded' 
      encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>
   </output>
  </operation>
 </binding>
  
 <service name='TestResultCollectorService'>
  <port name='TestResultCollectorPort' binding='TestResultCollectorBinding'>
   <soap:address location='http://myserver/mylocation/soapserver.php'/>
  </port>
 </service>
 
</definitions>";
?>


oftewel, de soapClient parsed niet op het moment dat hij het bestand inleest?

Acties:
  • 0 Henk 'm!

  • jnr24
  • Registratie: Oktober 2004
  • Laatst online: 27-08 11:48
waarschijnlijk wordt de <? echo $location; ?> tussen enkele quotes niet geparsed, zet die dus in de php:
<? echo "'".$location."'"; ?>
en dan die van de originele wsdl weghalen natuurlijk.

Bekijk je de output van je script wel eens zelf (in een browser bv) ? Dan had je dit vrij snel gespot. Of zit je maar te proberen tot die client het accepteert?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geweldig, probleem opgelost! de wsdl.php lag het niet aan. Probleem zat in de soapserver, die een lokaal pad meekreeg in plaats van een http pad. Thx guys en misschien een les voor anderen die met soaps aan het knutselen zijn!
Pagina: 1