[SOAP] WSDL met soapheaders

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben een webservice aan het opzetten vanuit PHP en ben hiervoor zelf de WSDL aan het maken. Nou willen we gebruik maken van SOAP-headers waarmee de externe gebruiker zich kan identificeren.

De WSDL (klik) definieert een functie insertUpdateClients. In de header staan 4 inlog-variabelen, en in de body kan een XML bericht worden gestuurd.

Als ik deze webservice in PHP aanspreek lijkt alles goed te gaan.

Nu externe partijen deze webservice willen aanspreken vanuit Visual Studio gaat er steeds iets mis. Het lijkt erop dat er een fout in de WSDL zit.

Als ik een SOAP-request genereer met XMLSpy zie ik ook iets vreemds: de header-variabelen staan zowel in de Header als in de Body.

Ik heb me ellendig gezocht naar goede informatie over het maken van een goede WSDL, maar wil er nog niet uitkomen. Ziet iemand wat ik mis doe?

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
misschien handig om wat code mee te posten, zodat we beter kunnen helpen?

hoe maak je de webservice aan?
hopelijk toch wel via de soapserver class? http://nl3.php.net/manual/en/class.soapserver.php

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had de code achterwege gelaten omdat ik het idee heb dat die server wel oké is, maar het probleem eerder in de WSDL ligt.

De server:
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
        $HTTP_RAW_POST_DATA = file_get_contents('php://input');
        if (empty($HTTP_RAW_POST_DATA)) {
            self::reportError('Bad request: No POST data');
        }

        // test xml
        try {
            $simpleXML = @simplexml_load_string($HTTP_RAW_POST_DATA);
        } catch (Exception $e) {
            self::reportError('Bad request: XML does not parse');
        }

        // include soap server
        $this->_loadModel("soapservices");

        // setup soap server with php's SoapServer class
        ini_set('soap.wsdl_cache_enabled', '0');
        $server = new SoapServer(URL.$this->wsdl);
        $server->setClass('SoapServices', $simpleXML);

        // handle request
        try {
            $server->handle($HTTP_RAW_POST_DATA);
            // @todo; implement XML return waarde indien handle een string returned.
        } catch (Exception $e) {
            $mesg = (DEV ? $e->getMessage() . '<br>' . $e->getFile() . ':' . $e->getLine() : $e->getMessage());
            $server->fault($e->getCode(), $mesg); // returned een nette soap foutmelding
        }


Met class SoapServices:
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
class SoapServices
{
    protected $simpleXML;

    public function __construct($simpleXML)
    {
        $this->simpleXML = $simpleXML;
    }

    /**
     * This function is called by SoapServer->handle() from the SoapController
     */
    public function __call($name, $arguments)
    {
        // include the right server action class
        require 'soapservices/' . strtolower($name) . '.php';

        // instantiate
        $server = new $name($this->simpleXML, $arguments);

        // handle request
        return $server->run();
    } 
}

Acties:
  • 0 Henk 'm!

  • TUX2K
  • Registratie: September 2001
  • Laatst online: 17-09 12:46
Jouw PhP script heeft een header mee van text/html.
Als ik mijn headers bekijk van een .net webservice dan zijn deze ander.
Namelijk text/xml

Mogelijk dat daar wat zit, tevens zal .net de WDSL opvragen door de webserver url aan te roepen met ?WSDL
Altijd in hoofdletters, waarom geen idee.

Tevens kan ik hem in visual studio 2008 gewoon aanroepen.
Afbeeldingslocatie: http://triplesoftware.nl/files/service_thumb.png

Maar dus niet toevoegen, het lijkt als of die een method niet aanspreekbaar is.

[ Voor 37% gewijzigd door TUX2K op 13-05-2009 15:57 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Klopt! Dit scherm in Visual Studio gaat nog goed, maar dan kom je niet verder. Ik heb overigens het content-type gewijzigd naar text/xml. Dit heeft nog niets opgelost.

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Probeer eens een losse functie toe te voegen aan je soap server met behulp van $server->addFunction();

ik krijg namelijk ook een functie terug als ik via een soapclient connect:

code:
1
2
3
4
array(1) {
  [0]=>
  string(129) "string insertUpdateClients(string $adviseur, string $adviseurPassword, string $context, string $contextPassword, string $request)"
}

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Al eens gezocht op de 'The HTML document does not contain Web service discovery information.' melding die visual studio geeft?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

Verwijderd

Haal de 4 soap:header regels 's weg uit de binding input? Dan maakt VS2008 tenminste een goede aanroep definitie van insertUpdateClientsRequest:
C#:
1
public insertUpdateClientsRequest(string adviseur, string adviseurPassword, string context, string contextPassword, string request)
Pagina: 1