Avatar billede michael_stim Ekspert
19. september 2014 - 17:47 Der er 11 kommentarer og
1 løsning

Overskrive/erstatte soap header

Skal sende en websservice afsted, men der kommer en forkert header med, dermed også forkerte navne i noderne. Den genererer xmlns:1 og xmlns:2, men skal bruge xmlns:tem og xmlns:pho. Nogen der har en løsning.

Tak på forhånd.
Avatar billede arne_v Ekspert
19. september 2014 - 19:21 #1
Koder du en WS client eller en WS server? Og er det request eller response som har problemet?
Avatar billede michael_stim Ekspert
19. september 2014 - 21:11 #2
Client, request. Har prøvet med en del kodestumper, men den beholder den originale header og sætter min nye under. Har desværre ikke tilgang til koden nu, men kan komme med et lille eksempel. Jeg tror problemet er at der skal en security-header under den originale header, hvilket fungerer, men den originale header vil ikke væk.


class mySoap extends SoapClient
{
    public function __doRequest($request, $location, $action, $version)
    {
        $result = parent::__doRequest($request, $location, $action, $version);
        $result = str_replace('<key xsi:type="xsd:int">', '<key xsi:type="xsd:string">', $result);
        return $result;
    }
}


Har prøvet noget á la det. Men kan komme med mere input på mandag. Kan sige så meget at jeg samler alt min data i et array, og putter det ind med hjælp af SoapClient.
Avatar billede arne_v Ekspert
19. september 2014 - 21:18 #3
Der er ingen tvivl om at den paene loesning er at fixe SoapClient.

Jeg kan muligvis proeve at kigge lidt paa det i weekenden.

Men hvis det er et presserende vigtigt problem, saa kan du overveje et hack.

real.php med SoapClient -> hack.php -> web service

hvor hack.php processer request og respons som XML text og kan manipulere dem som XML.
Avatar billede michael_stim Ekspert
19. september 2014 - 21:40 #4
Jeg er utroligt taknemmelig over at du gider at bruge din tid herinde Arne, men du behøver ikke at spilde din tid, da jeg ikke har noget konkret kode at komme med. Prøvede at connecte via rdp til min arbejds PC, men da jeg kører linux hjemme og win på arbejde kan jeg åbenbart ikke komme ind på min PC. Går fint fra win til win og har før connectet fra linux til win, men der er åbenbart et eller andet der stopper mig i gatewayen. Jeg vender tilbage på mandag.
Avatar billede michael_stim Ekspert
22. september 2014 - 08:30 #5
Klasse til at overskrive (skal blive til den øverste header):


if (!class_exists("XSoapClient")) {
    class XSoapClient extends SoapClient {
        public function __doRequest($request, $location, $saction, $version, $one_way = 0) {
            echo $request." request<br>";
            echo $location." location<br>";
            echo $saction." action<br>";
            $aReplace = array('xmlns:ns1', 'xmlns:ns2');
            $aReplaceTo = array('xmlns:pho', 'xmlns:tem');
            //$dom = new DOMDocument();
            $request = str_replace($aReplace, $aReplaceTo, $request);
            //$dom->loadXML($request);
            //echo $request;
            return parent::__doRequest($request, $location, $saction, $version, $one_way = 0);
        }
    }
}


$ns = URL til security
ApplicationHeader = Header til security
$tBodyXML = array der skal ind i XML


$objVar_Session_Inside = new SoapVar($this->ApplicationHeader(), XSD_ANYXML, null, null, null);
        $actionHeader = new SoapHeader($ns, 'Security', $objVar_Session_Inside, false);
        $this->oClient->__setSoapHeaders($actionHeader);

        try {
            $this->oResult = $this->oClient->RegisterApplication(array('application' => $tBodyXML));
        } catch


Og i constructoren kalder jeg på denne funktion:


private function XWebServiceObject() {
        try {
            $this->oClient = new XSoapClient($this->tWSDL, $this->aOptions);
        } catch (Exception $exception) {
            $this->tError .= $exception->getMessage();
        }
    }


Kan det være som så at securityheaderen tager en ekstra header med og dermed overskriver den jeg allerede har overskrevet?
Avatar billede michael_stim Ekspert
22. september 2014 - 15:10 #6
Hej Arne,

Problemet løst. Det viste sig at det var rigtigt det jeg havde lavet, det var "bare" den originale header der blev vist i loggen :(

Tak for din tid.
Avatar billede michael_stim Ekspert
23. september 2014 - 12:59 #7
Lægger du et svar Arne, som tak for din tid?
Avatar billede michael_stim Ekspert
24. september 2014 - 14:36 #8
Du kan måske derimod hjælpe mig med at få et namespace ind i en eksisterende node?

Generere denne node i requesten <RegisterApplication> men det skal blive til <RegisterApplication xmlns="http://tempuri.org/">

Kan læse mig til at det er noget med soapvar og soapparam men får en fejl:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: SoapVar has no 'enc_type' property in

Her er koden:

/** Add namespaces to nodes */
        $tRegisterNS = "http://tempuri.org/";
        $oSoapVar = new SoapVar($tBodyXML, XSD_NAMESPACE, 'RegisterApplication', $tRegisterNS, 'xmlns');
        $this->oClient->RegisterApplication(new SoapParam($oSoapVar, 'RegisterApplication'));
Avatar billede michael_stim Ekspert
24. september 2014 - 14:38 #9
Hov, kan jo ikke bruge $tBodyXML, det er jo ikke der <RegisterApplication> er.
Avatar billede michael_stim Ekspert
26. september 2014 - 16:47 #10
Er løst.
Avatar billede arne_v Ekspert
02. oktober 2014 - 03:26 #11
Jeg springer over point her - jeg har ikke rigtigt bidraget med noget.
Avatar billede michael_stim Ekspert
02. oktober 2014 - 10:09 #12
OK, men tak for din tid.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Udviklings- og Forenklingsstyrelsen

Testmanager med agilt mindset

Cognizant Technology Solutions Denmark ApS

SAP Project Manager

Dynamicweb Software A/S

Tech Team Lead