Visualizzazione risultati 1 fino 4 di 4

Discussione: Informazione PHP e WSDL connessione soap

  1. #1
    Guest

    Predefinito Informazione PHP e WSDL connessione soap

    Ciao a tutti,
    Spiego quello che vorrei fare, forse qualcuno di voi conosce già un code open source da poter poi personalizzare.
    Allora abbiamo i nostri wsdl(web service description languages), che viene richiamato con il php in connessione soap, per chi conosce un pò la struttura del wsdl sa che solitamente in tutti i wsdl ci sono delle testate di input(parametri in entrata che di solito sono fissi) e fin qui si potrebbe creare una funzione che ti ritorna l'intera testata, tanto se la testata da wsdl a wsdl non cambia grossi problemi non ce ne sono.
    Poi il wsdl ha delle "operation" e queste operation ovviamente cambiano da wsdl a wsdl in base all'operation ha dei parametri in input che possono cambiare da operation a operation, alcuni possono essere dei tag tns(type namespace) quindi in php sono di solito array oppure potrebbero essere dei choice cioè delle scelte cioè dal php passi o A o B oppure delle semplici stringhe numeriche o alfanumeriche, in base all'operation ed ai parametri che accetta l'operation ci si creano tutti gli array si passano i parametri etc...e poi con la soap si passa la chiamata per la risposta del wsdl e se tutti i parametri sono giusti il wsdl risponde un stdClass che poi va gestita in php e nell'html.
    Che cosa vorrei fare io?
    Vorrei creare una classe che indipendentemente dalle operation e dal wsdl(quindi deve funzionare per tutti i possibili wsdl) vado a scrivere solamente l'operation del wsdl ed in automatico mi dica quali variabili accetta e come sono le variabili in modo che io poi chiamerò un metodo nella mia classe a cui passo solamente le variabili e il mio metodo analizzerà le variabili le invierà all'operation e poi mi ritorna una risposta.
    Perchè adesso creo ogni volta il codice PHP andando a leggere punto per punto il wsdl e creandomi i miei array o le mie variabili caso per caso....
    Secondo voi, si può innanzi tutto creare una classe che mi permette di leggere ed inviare dinamicamente variabili ai wsdl(calcolando che le operation ed ovviamente la struttura dei parametri che accetta il wsdl cambia da wsdl a wsdl) e se si conosce già un codice open source che permetta di fare ciò?
    Ad esempio questa, la __getFunctions ritorna il nome di tutte le operation di quel wsdl

    http://php.net/manual/en/soapclient.getfunctions.php

    Poi ogni operation accetterà dei parametri in input e così via, quindi bisognerà creare il codice ad hoc di quei parametri dal PHP e poi fare la chiamata vera e propria alla operation del wsdl cioè

    $risposta = $client->__soapCall("operationChiamata", array($parametri));

    Qualche idea o qualche codice a classi già fatto da poter creare tutto dinamicamente?

    PS:Di solito quell'array($parametri) è composto in maniera multidimensionale da array di testata e array di parametri che sono necessari alla operationChiamata io non voglio starmi a creare ogni volta gli array ad hoc leggendo il wsdl ma vorrei grazie ad un metodo che mi dica quanti parametri devo passare e che TIPO DI PARAMETRO accetta in modo che io scrivo solamente

    Codice PHP:
    $testata= creaTestata('pippo','pluto','paperino'); //la crea testata sarà creata ad hoc per andare a compilare l'array di testat
    $parametriAccettatiDallaOperation = compilaOperation('nomeOperation, 'pippo','pluto','paperino') // la compila operation crea tutto dinamicamente in base al nome dell'operation.
    $parametri = array('testata'=>$testata, 'parametriAccettatiDallaOperation'=>$parametriAccettatiDallaOperation);
    $risposta = $client->__soapCall("operationChiamata", $parametri);
    var_dump($risposta);
    In generale una cosa di questo genere, perchè adesso creo tutti gli array e tutte le dimensioni dell'array ogni volta andando sempre a leggere wsdl per wsdl....Vorrei qualcosa di più comodo e usabile diverse volte.
    Ultima modifica di fractalcosmo : 16-01-2016 alle ore 14.43.59

  2. #2
    Guest

    Predefinito

    Ragazzi non si può, o meglio ho isolato tutto quello che può essere isolato, quindi la testata è creata tramite una funzione che ritorna la testata, quindi non si inseriscono ogni volta gli array di testata ma si chiama la funzione, lo stesso ovviamente per la connessione, basta passargli il path del wsdl ed il link, ho creato una fuzione anche per la risposta basta solo passargli il nome dell'operation e i parametri che accetta l'operation.
    I parametri che accetta l'operation sono la testata e l'array di valori per quella determinata operation, questi array di valori sono l'unica cosa che non si può creare dinamicamente.
    Perchè non si può sapere che tipo di parametri accetta l'operation, per eseguire l'operation può bastare una stringa(esempio codice cliente) oppure tanti array multidimensionali non si può fare una cosa generale.
    Con il php ho creato due funzioni una per il ritorno dei tipi dato ed una per il ritorno delle operation(funzioni), così almeno dal PHP senza entrare nel wsdl si può sapere quali sono i tipi dato e quali sono i tipi operation...almeno quello, ma non si può fare di più.
    A me se le testate sono tutte uguali, la connessione e la risposta anche rimane solo da leggere il wsdl per impostare gli array che vanno passati alla operation.....È già un bel passo avanti

  3. #3
    Guest

    Predefinito

    Ragazzi ci siamo quasi arrivati in fondo...però mi manca un piccolo punto, qualcuno mi do dare una mano?allora mettiamo caso il XSD(non wsdl ma lo schema) sia strutturato così(esempio trovato in internet);

    Codice HTML:
    <xsd:complexType name="personinfo">
      <xsd:sequence>
        <xsd:element name="firstname" type="xs:string"/>
        <xsd:element name="lastname" type="xs:string"/>
      </xsd:sequence>
    </xsd:complexType>
    
    <xsd:complexType name="fullpersoninfo">
          <xsd:sequence>
            <xsd:element name="address" type="xs:string"/>
            <xsd:element name="city" type="xs:string"/>
            <xsd:element name="country" type="xs:string"/>
          </xsd:sequence>
    </xsd:complexType>
    Adesso io sono riuscito ad ottenre sia tutti gli elementi con questo codice:

    Codice PHP:

    $xmlPath
    ='mioSchema.xsd';

    $xml = simplexml_load_string($xmlPath);

    print
    "Tutti gli elementi";

    $elementi= array_map('strval', $xml->xpath('//xsd:complexType/xsd:sequence/xsd:element/@name'));
    foreach(
    $elementi as $nomeElementi){

    print
    $nomeElementi.'<br>';

    }
    Lo stessa cosa per i tipi complessi ma cambiando il nodo nell'xpath cioè //xsd:complexType/@name

    adesso qual'è il problema?Sembrarà una domanda stupida ma in questa maniera io ottengo l'elenco di tutti gli elementi e di tutti i complex type ma non nella forma che voglio io...cioè io voglio una struttura che sia

    complex : personinfo
    element : firstname
    element : lastname
    complex : fullpersoninfo
    element : address
    element : city
    element : country


    invece adesso ho
    Tipi Complessi:
    personinfo
    fullpersoninfo
    Elementi:
    firstname
    lastname
    address
    city
    country

    Cioè l'elenco....io devo ciclare gli elementi per quel corrispettivo complexType...ma non ci salto fuori non so come impostare il ciclo forse si fa con for e non con foreach o con una callback...ma non so come ciclarli adeguatamente...Se uso il for poi non si sa dove mettere la $i perchè la scrittura del ciclo è diversa...

    Non so come scriverlo perchè se metto un foreach dentro il foreach il parse cicla ad ogni complexType tutti gli elementi...ovviamente....quindi ci vuole un indice che faccia capire al parse guarda che ad ogni complexType print i corrispettivi elementi di quel complexType e poi continua...Ma non so proprio come scriverlo anche perchè non è che conosco bene in DOMdocument di php...Qualcuno ha qualche dritta..
    Ultima modifica di fractalcosmo : 20-01-2016 alle ore 20.41.40

  4. #4
    Guest

    Predefinito

    Raga ci sono riuscitoooooo....Allora metto il codice se dovesse servire in futuro a qualcuno, questo codice(che poi mettero dentro una funzione) scrive in rosso tutti i complexType dell'XSD e sotto il rispettivo complex type crea un array con i rispettivi elementi, la cosa bella è che per ogni elemento del complexType crea un array con tutti gli attributi e ti dice che cosa sono...esempio del print finale:


    Complessi ed Elementi :
    ControllaCliente
    1Array
    (
    [0] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [name] => testataOutput
    [type] => testata:TestataOutput
    )

    )

    [1] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [name] => controllaClienteData
    [type] => tns:ControllaClienteReadData
    )

    )

    )

    Complessi ed Elementi :
    ControllaClienteCompleto
    1Array
    (
    [0] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [name] => testoDaControllare
    [type] => tipi-testata:StringaNonVuota
    )

    )

    [1] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [name] => divisa
    [type] => tipi-comuni:Divisa
    [nillable] => true
    )

    )

    [2] => SimpleXMLElement Object
    (
    [@attributes] => Array
    (
    [name] => dataRiferimento
    [type] => xsd:date
    [nillable] => true
    )

    )

    )


    Quindi ad ogni tipo complesso(nel codice viene printato in rosso così salta all'occhio) inserisce i rispettivi elementi dentro gli array con i rispettivi attributi quindi sai già cosa accetta se è un tns una stringa, nullable etc....Spettacolo, così è perfetto, è una sorta di debug, è una funzione di comodo che serve per parsare l'XSD dal PHP...Ciao a tutti nbuona giornata

    Codice PHP:

    $pathXsd
    = "mioFile.xsd";

    $pathXsd = file_get_contents($pathXsd);
    //utilsController::varDump($pathXsd);

    $xml = simplexml_load_string($pathXsd);

    $elementPath = $xml->xpath('//xsd:complexType/xsd:sequence/xsd:element');
    $complexPath = $xml->xpath('//xsd:complexType');

    //utilsController::varDump($elementPath);
    $elementNames = array_map('strval', $xml->xpath('//xsd:complexType/xsd:sequence/xsd:element/@name'));
    $complexNames = array_map('strval', $xml->xpath('//xsd:complexType/@name'));

    $namespaces = $xml->getNameSpaces(true);
    $getNomi= $xml->getName();
    $xs = $xml->children($namespaces['xsd']);

    //foreach($xs->complexType as $complex) {
    // $tipiComplessi = $complex->attributes()->name.'<br>';
    // print 'TipiComplessi : '.'<br>' .$tipiComplessi.'<br>';
    //}
    //print 'Tutti gli elementi all\'interno dei complex : '.'<br>';
    ////utilsController::varDump($elementNames);
    // while(list($var , $node) = each($elementNames)) {
    // echo ' Elemento Nome : '. $var.' '.$node.'<br>';
    // }
    //
    foreach ($complexNames as $complex){
    print
    '<span style="color:red">'.$complex.'</span><br>';
    $elementPath = $xml->xpath("//xsd:complexType[@name='$complex']/xsd:sequence/xsd:element");
    print
    '<pre>';var_dump($elementPath);print'</pre>';
    }
    Ultima modifica di fractalcosmo : 21-01-2016 alle ore 12.27.01

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •