[PHP5/SOAP] PHP + Microsoft MapPoint Web Service

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil gebruik maken van de Microsoft MapPoint Web Service. Hiervoor wil ik PHP5 gebruiken i.c.m. de SOAP extensie.

Om te kijken of SOAP correct geconfigureerd is, heb ik gebruik gemaakt van een eenvoudige webservice (http://webservices.codingtheweb.com/bin/qotd.wsdl), die een "quote-of-the-day" laat zien. Dit ging allemaal prima.

Nu wil ik gebruik maken van de veel complexere MapPoint Web Service van Microsoft. Probleem is dat het mij niet lukt om welke methode dan ook aan te roepen. Verder weet ik bijvoorbeeld ook niet waar en hoe ik mijn account-gegevens moet meesturen.

Google levert geen bruikbare resultaten, waar gesproken wordt over MapPoint i.c.m. PHP.

Heeft hier niemand ervaring met MapPoint? Ik zou heel erg geholpen zijn als ik al eens wist hoe ik een methode moest aanroepen van MapPoint en bijvoorbeeld een lijstje met landen zou kunnen ophalen...

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
De SOAP service geeft genoeg info over de datatypen en methoden om de service aan te roepen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<pre>
<?
        
    try {
        $client = new SoapClient("http://staging.mappoint.net/standard-30/mappoint.wsdl");  
        print_r($client->__getTypes());
        print_r($client->__getFunctions());
    }
    catch(SoapFault $e) {
        print_r($e);
    }

?>
</pre>


ik ben er nog niet helemaal uit of PHP-SOAP nou wel of niet zelf al de classes aanmaakt voor de complexTypes, ik geloof van niet (terwijl ze dat wel beloofden ooit). Maar met de informatie uit SoapClient::getTypes() kun je iig vrij eenvoudig een scriptje schrijven dat dynamisch classes daarvoor genereert.

--edit--

hm mappoint loopt idd te bokken als ik een call doe...ff uitzoeken waarom

[ Voor 10% gewijzigd door Genoil op 06-12-2004 15:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt. Deze 2 methodes had ik zelf ook al gevonden (maar niet veremld in mijn post), maar als ik dus een methode aanroep (bijvoorbeeld GetVersionInfo) moet ik een parameter meegeven van een type dat ik niet ken. Ik hem ook geprobeerd een klasse GetVersionInfo te maken met de variabelen erin zoals het op MSDN staat, maar dit werkt ook niet. Inmiddels heb ik op een MSDN nieuwsgroep een voorbeeldje met de NuSOAP-klasse gevonden, en ben al zover, dat ik heb ontdekt dat er geen output komt als ik mijn account-gegevens (credentials) niet meegeef. Ik zal eerst maar gaan uitzoeken hoe ik dat doe zonder NuSOAP.

Ik krijg overigens deze error:

SoapFault exception: [SOAP-ENV:Client] looks like we got no XML document in C:\oracle\ora81\Apache\Apache\htdocs\mappoint.php:68
Stack trace:
#0 C:\oracle\ora81\Apache\Apache\htdocs\mappoint.php(68): SoapClient->GetVersionInfo('GetVersionInfo', Array)
#1 {main}

[ Voor 20% gewijzigd door Verwijderd op 06-12-2004 15:34 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ja idd dat krijg ik ook. ik heb ff zo'n formuliertje ingevuld om ook credentials toegestuurd te krijgen maar die slackers van MS mailen niet.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat duurt een paar dagen. je krijgt dan een 45-dagen account.

ik heb inmiddels een NuSOAP voorbeeld werkend (haalt lijstje op met alle landen van de wereld)

wat mij opvalt is, dat het zo'n 5 seconden duurt voordat de pagina wordt weergegeven, terwijl er alleen maar een selectboxje staat met landnamen. (server staat lokaal en kan downloaden met 4 mbit)

ik vraag me af of die door de NuSOAP klasse komt, of dat de testservers en de verbinding van microsoft gewoon traag zijn.

om een vergelijking te kunnen maken moet ik eerst hetzelfde resultaat bereiken met de soap-extensie voor php. weet iemand hoe ik credentials kan sturen?

Ik heb dit regeltje uit de NuSOAP klasse gehaald, maar dit werkt niet (krijg melding header already sent by blabla):

code:
1
header('Basic ' . base64_encode(str_replace(':','',$username) . ':' . $password));

[ Voor 69% gewijzigd door Verwijderd op 06-12-2004 16:04 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
PHP SOAP ondersteunt helaas nog geen HTTP Digest Authentication, ook bekend onder bug #28041. Ook in 5.03 geen fix hiervoor (maar wel fixes voor heel veel andere SOAP bugs).

--edit--

maar ik zie dat NuSOAP dus blijkbaar Basic Auth gebruikt (terwijl op de mappoint site staat dat het digest auth is), wellicht kun je dan gewoon je credentials meegeven in de constructor van je client?

[ Voor 39% gewijzigd door Genoil op 06-12-2004 17:26 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Klopt.

Ik heb geprobeerd de setCredentials-functie uit de NuSOAP klasse te kopieëren, om zo een HTTP-header samen te stellen.

Als ik de header wil verzenden krijg ik de volgende melding:

Cannot modify header information - headers already sent by (output started at C:\oracle\ora81\Apache\Apache\htdocs\mappoint.php:10) in C:\oracle\ora81\Apache\Apache\htdocs\mappoint.php on line 110

regel 10 is waar PHP begint, dus waar <? staat
regel 110 is waar de header verzonden wordt.

ik denk dat ik maar eens contact ga opnemen met een van de developers. anders wordt het NuSOAP gebruiken.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
probeer die header eens te versturen op regel 1 van mappoint.php, dan zou je die foutmelding iig niet meer moeten hebben.

--edit--

kep er nog heel even mee lopen pielen (vind het nl. op zich ook wel een leuke service om wat mee aan te prutsen ;)) en wat ik steeds maar terug krijg is een HTTP 401 Digest auth dinges...dat vertaalt zich in "looks like we got no XML document", maar middels Ethereal kwam ik erachter wat er werkelijk door de kabel terugkomt...

[ Voor 59% gewijzigd door Genoil op 07-12-2004 11:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
In een nieuwsgroep van MSDN vond ik een aantal mensen met vergelijkbare problemen. Daar bood iemand van Microsoft een 'store locator example' aan in PHP aan. Deze maakte ook gebruikt van de NuSOAP klasse en hiermee lukt het meeste wel. Het is allemaal wel redelijk ingewikkeld, maar ik ben al zo ver dat ik al kaartjes kan tekenen met zgn. 'pushpins' erop.

In ieder geval bedankt voor je hulp. Zonder je hulp had ik me nu nog zitten afvragen waarom ik de SOAP-extensie van PHP5 niet werkend kreeg.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
tijd om mijn oude topic maar eens te kicken.

ik ben al zover dat ik een route kan plannen met MapPoint, inclusief kaartjes, tussenstops, etc.

De resultaten van de route worden standaard weergeven in het Engels (vb.: Turn RIGHT (West) onto Einsteinstraat)

Nu staat op de site van microsoft dat mappoint ook resultaten in andere talen kan terugsturen (ook nederlands). Om de resultaten terug te krijgen moet eerst een soap-header ("CultureInfo")verstuurd worden. (http://msdn.microsoft.com...evCommonClCultureInfo.asp)

Nu is mijn vraag hoe ik dergelijke SOAP-headers kan versturen d.m.v. de NuSOAP klasse.

Ik dus een client-object, genaamd $client. Er bestaat in de klasse van dit object een methode setHeaders($headers). In $headers moet een XML string volgens de NuSOAP documentatie.
Nu zijn mijn vragen:
1) kan ik deze methode überhaupt gebruiken?
2) hoe zit zo'n XML-string er dan uit?

Acties:
  • 0 Henk 'm!

Verwijderd

Het lijkt me vreemd als je tussen je andere (?) headers ineens een xml format moet gebruiken.

Maar het zou dan zoiets als

<CultureInfo>
<Name>
nl
<Name/>
<CultureInfo/>

kunnen zijn.

[ Voor 9% gewijzigd door Verwijderd op 05-01-2005 10:57 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
op de MSDN nieuwsgroep kreeg ik de volgende oplossing:

code:
1
$client->setHeaders('<UserInfoRouteHeader xmlns="http://s.mappoint.net/mappoint-30/"><Culture><Name>nl</Name><Lcid>19</Lcid></Culture></UserInfoRouteHeader>');


(die 19 (Lcid) is code voor Nederland)
Pagina: 1