WebServices PHP

Ciao a tutti,

volevo sapere se qualcuno conosceva qualche classe per far interagire php con i webservice, inoltre, se possibile, se mi potreste spiegare, giusto in 2 righe, il funzionamento...

Ho cercato documentazione online, ma non mi è molto chiaro...

Ringrazio anticipatamente.

Ciao

Lore

inviato 10 anni fa
Lore
Lore
1
X 0 X

Ci sono 3 strade che puoi seguire:

puoi usare NuSOAP:

http://www.scottnichol.com/soap.htm <- è tutto spiegato qui

oppure PEAR::SOAP:

http://pear.php.net/package/SOAP

per degli esempi basta una ricerca su Google

oppure l'estensione SOAP di PHP5:

http://it2.php.net/manual/en/ref.soap.php

ma non so dove potresti trovare esempi.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Innanzitutto grazie Gianni...

Ci sono 3 strade che puoi seguire:

puoi usare NuSOAP:

http://www.scottnichol.com/soap.htm <- è tutto spiegato qui

oppure PEAR::SOAP:

http://pear.php.net/package/SOAP

per degli esempi basta una ricerca su Google

oppure l'estensione SOAP di PHP5:

http://it2.php.net/manual/en/ref.soap.php

ma non so dove potresti trovare esempi.

 :bye:

Proverò una delle prime 2 poichè, purtroppo sui server su cui lavoro, non abbiamo installato php5... :-\

CMQ ti ringrazio.

Vediamo che si riesce a combinare  con questi 2 link ;)

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Scusa Gianni,

ho guardato i link che mi hai postato, ora, premettendo che è la prima volta che affronto l'argomento ( quindi ne so' poco un ca..o), ti pongo una domanda, non so se sia stupida o meno...

Allora, il mio problema è che dovrebber girarmi ad un link ad un file '.wsdl' da cui dovrei prelevre delle info...

I link che mi hai postato, servono al mio scopo?

Perchè la classe nelle pear che mi hai postato, purtroppo non mi funzione e nell'altro link (nusoap) viene spiegato come creare webservice, e non come interrogarli...

Chiedo nuovamente venia per la domanda probabilmente stupida, ma è da stamattina che cerco in giro e non sono venuto a capo di niente purtroppo...

Grazie1000ancora

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Ciao

Se vuoi solo interrogare un WebService devi vedere la parte Client di Nusoap

e tralasciare la perte server (serve per creare i webservice) .

dai un occhiata a questo esempio

http://freephp.html.it/articoli/view_articolo.asp?id=105&pag=2

risposto 10 anni fa
nino
nino
1
X 0 X

Grazie anche a te nino,

ora provo a guardare anche il link che mi hai postato tu...

Scusate ragazzi, non è che qualcuno avrebbe un esempio, perchè sinceramente sono in alto mare...

Per ora so che mi dovrebbe essere giraqto un file wsdl che io dovrò interrogare, no so altro al momento, ma i link che ho letto sinora non sembrerebbero fare al caso mio...

Grazie!

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Nel link che ti ho postato su NuSoap trovi diversi esempi. In particolare questa pagina mostra come lavorare con i file wsdl:

http://www.scottnichol.com/nusoapprogwsdl.htm

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni,

riapro la questione perchè, sinceramente non mi è molto chiara...

Allora, ho visto il link che mi hai postato ed ho copiato l'esempio:

// Pull in the NuSOAP code
require_once('nusoap.php');
// Create the client instance
$client = new soapclient('http://xxxxxx.org:8080/xxxx/wsdl/nome_file.wsdl', true);
// Check for an error
$err = $client->getError();
if ($err) {
    // Display the error
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    // At this point, you know the call that follows will fail

// Call the SOAP method
//$result = $client->call('hello', array('name' => 'Scott'));
// Check for a fault
if ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
} else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
        // Display the error
        echo '<h2>Error</h2><pre>' . $err . '</pre>';
    } else {
        // Display the result
        echo '<h2>Result</h2><pre>';
        print_r($result);
    echo '</pre>';
    }
}
}
// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';

Ora, questo script mi restituisce una pagina in cui mi si presentano:

Request Response Debug

(qui diverse voci di debug...)

Se non ho capito male, il file wsdl dovrebbe restituirmi un oggetto con i metodi specificati nel file stesso e l'oggetto restituito dovrebbe essere utilizzabile da vari linguaggi (java, .NET ecc ecc...).

E' giusto fin qui?

Ora, l'esempio che ho copiato dal link che mi hai consigliato, non penso faccia già questo, o sbaglio?

Ossia, basta fare quello per avere l'oggetto in questione?

Spero tanto di non aver sbagliato tutto  :P

Grazie1000per l'attenzione.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Ciao Lore.

Questa righa nel codice

//$result = $client->call('hello', array('name' => 'Scott'));

la devi decommentare rappresenta la chiamata al webservice

dove 'hello' e la funzione remota e array('name' => 'Scott') e l'input della funzione

mentre in $result otterrai l'array di risposta

risposto 10 anni fa
nino
nino
1
X 0 X

Ciao Lore.

Questa righa nel codice

//$result = $client->call('hello', array('name' => 'Scott'));

la devi decommentare rappresenta la chiamata al webservice

dove 'hello' e la funzione remota e array('name' => 'Scott') e l'input della funzione

mentre in $result otterrai l'array di risposta

Questa è una cosa che non ho capito, quella riga di codice:

è relativa al file wsdl dell'esempio http://www.scottnichol.com/nusoapprogwsdl.htm#hwclient

ma io ho un altro file wsdl, o meglio un link...

La funzione hello, va chiamata in ogni caso oppure devo fare una funzione a parte?

Ma cosa + importante, cosa serve quella funzione?Scusate le domande che possono sembrare banali, ma dato che non ho avuto molto tempo per spulciare il codice, sono un po' in panne...

In definitiva, però ho capito che in $result ( dell'esempio ) dovrei avere l'oggetto che serve a me con i metodi relativi ( specificati nel wsdl ), questo almeno l'ho capito giusto?  :P

Grazie ancora.

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Al posto di 'hello' dovresti chiamare la funzione che il webservice mette a disposizione

e passare come parametro l'array che rappresenta il messaggio xml di input.

Prova a collegarti direttamente al link del tuo webservice per i dettagli.

Il file WSDL è solo una descrizione formale del webservice ad esempio

su http://www.xmethods.com trovi vari webservice a cui puoi provare a connetterti.

Dalla descrizione del wsdl nella sezione <type> trovi la struttura dell'input e dell'output

mentre in <message> trovi i nomi delle funzioni che hai a disposizione.

Infine  $result  sarà un array che rappresenta l'xml di risposta.

risposto 10 anni fa
nino
nino
1
X 0 X

Al posto di 'hello' dovresti chiamare la funzione che il webservice mette a disposizione

e passare come parametro l'array che rappresenta il messaggio xml di input.

Prova a collegarti direttamente al link del tuo webservice per i dettagli.

Il file WSDL è solo una descrizione formale del webservice ad esempio

su http://www.xmethods.com trovi vari webservice a cui puoi provare a connetterti.

Dalla descrizione del wsdl nella sezione <type> trovi la struttura dell'input e dell'output

mentre in <message> trovi i nomi delle funzioni che hai a disposizione.

Infine  $result  sarà un array che rappresenta l'xml di risposta.

Scusa la mia ignoranza estrema ::asino::

<wsdl:types>

-

   <schema elementFormDefault="qualified" targetNamespace="http://ws.xxxx.it">

-

   <element name="valore1">

-

   <complexType>

-

   <sequence>

<element name="xmlRequest" type="xsd:string"/>

</sequence>

</complexType>

</element>

-

   <element name="valoreResponse">

-

   <complexType>

-

   <sequence>

<element name="valoreReturn" type="xsd:string"/>

</sequence>

</complexType>

</element>

</schema>

</wsdl:types>

-

   <wsdl:message name="valroeResponse">

<wsdl:part element="impl:valroeResponse" name="parameters"/>

</wsdl:message>

-

   <wsdl:message name="valoreRequest">

<wsdl:part element="impl:valore1" name="parameters"/>

</wsdl:message>

-

   <wsdl:portType name="valroeWs">

-

   <wsdl:operation name="valore1">

<wsdl:input message="impl:valoreRequest" name="valoreRequest"/>

<wsdl:output message="impl:valoreResponse" name="valoreResponse"/>

</wsdl:operation>

</wsdl:portType>

-

   <wsdl:binding name="valoreSoapBinding" type="impl:valoreWs">

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

-

   <wsdl:operation name="valoreRQ">

<wsdlsoap:operation soapAction=""/>

-

   <wsdl:input name="valoreRequest">

<wsdlsoap:body use="literal"/>

</wsdl:input>

-

   <wsdl:output name="valoreResponse">

<wsdlsoap:body use="literal"/>

</wsdl:output>

</wsdl:operation>

</wsdl:binding>

-

   <wsdl:service name="valoreService">

-

   <wsdl:port binding="impl:valoreSoapBinding" name="valoreWs">

<wsdlsoap:address location="http://xxx:8080/xx/xx/valoreWs"/>

</wsdl:port>

</wsdl:service>

</wsdl:definitions>

Io avrei uno schema del genere (vedi sopra), quindi le funzioni che dovrei utilizzare sono quelle specificate negli attributi message:"cccc", corretto?

Ma l'array che devo passare quali valori dovrà contenere?

Scusa ancora se approfitto, ma non ne sto venendo a capo...

 Grazie 1000 ancora!

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Ciao Lore, potresti riportare integralmente il file WSDL, o darci il link? Anche via PVT.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

dai un occhiata a questo esempio spero che ti aiuti

<?php
require_once("nusoap.php");

//indirizzo del webservice a cui puoi collegarti per vedere
//la descrizione wsdl. Togliendo ?WSDL vedrai le varie funzioni del webservice
$wsdl="http://www.dataaccess.com/webservicesserver/conversions.wso?WSDL";


$client=new soapclient($wsdl,'wsdl');


//array di input che rappresenta xml
//<NumberToWords>
//    <ubiNum>numero</ubiNum>
//</NumberToWords
$input = array(array("ubiNum"=>150));

//chiamata al webservice
$trovato=$client->call('NumberToWords',$input);


//stampo l'array di output che rappresenta l'xml di risposta
//    <NumberToWordsResponse>
//      <NumberToWordsResult>string</NumberToWordsResult>
//    </NumberToWordsResponse>
print"<pre>";print_r($trovato);print"</pre><p>";


// Display the request and response
echo '<h2>Request</h2>';

   $text = htmlspecialchars($client->request, ENT_QUOTES);
   $remove = array ("<"," x");
   $insert = array ("<br><","<br>    x");
   $text = str_replace($remove, $insert, $text);

echo '<pre>' . $text . '</pre>';
echo '<h2>Response</h2>';

   $text = htmlspecialchars($client->response, ENT_QUOTES);
   $remove = array ("<"," x");
   $insert = array ("<br><","<br>    x");
   $text = str_replace($remove, $insert, $text);

echo '<pre>' . $text . '</pre>';

// Display the debug messages
echo '<h2>Debug</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';


?>
risposto 10 anni fa
nino
nino
1
X 0 X

Lore, due domande: cosa ti è stato chiesto di fare? Su cosa hai problemi? Messaggi di errore?

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

@nino grazie per lo script, ho provato a farlo girare e l'ultima riga che visualizza è:

soapclient: got wsdl error: Unable to retrieve WSDL data for operation: NumberToWords

è corretto che dia questo errore?

Perchè ho provato anche con il mio file wsdl e mi da la stessa cosa (naturalmente per la funzione che utilizzo io).

@Gianni, ti ho risp in pvt.

Grazie cmq ad entrambi per l'aiuto.

Spero di riuscire a venirne a capo

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Come procede? Novità? A che punto sei?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Come procede? Novità? A che punto sei?

Ciao Gianni,

sono riuscito a procedere grazie soprattutto all'aiuto tuo e di nino...

Ora sono arenato sul fatto che dovrebbe restituirmi un array, ma non restituisce nulla purtroppo...

Posterei un po' di codice,ma dato che ci sono link a siti esterni, purtroppo non posso...

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Ciao Lore.

Alla funzione $client->call puoi passare al posto di un array una stringa xml ad esempio:

$input="
 <getBook>
    <titolo attr='1'>
      <tag1>titolo1</tag1>
      <tag2>titolo2</tag2>
   </titolo>
 </getBook>";

$trovato=$client->call('getBook',$input);

Ho provato anche io ha dare il nuovo input ma ottengo un errore nella

deserializzazione poiche trova dei nodi figli che non si aspetta.

Per quello che ne so (non sono un esperto caso mai mi sbaglio) la struttura xml dell'input e dell'output

è descritta nel wsdl e in quello visto la struttura era

<OTA_HotelAvailRQ>

    <xmlRequest>string</xmlRequest>

</OTA_HotelAvailRQ>

Forse il nuovo input è di un altro wsdl.

risposto 10 anni fa
nino
nino
1
X 0 X

Per l'input ( richieste da fare ), mi hanno dato un file xml che pressapoco è così:

<?xml version="1.0" encoding="UTF-8" ?> 
- <TEST xmlns="xxxxxxxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="xxxx/xxxx/file.xsd" AvailRatesOnly="true" Version="3.14">
- <POS>
- <Source>
  <SourceID Type="95" ID="AWE12" /> 
  </Source>
  </POS>
- <SegmentsRequests>
- <SegmentRequest>
  <Date  Inizio="2004-12-02" Fine="2004-12-10"  /> 
- <Stanze>
- <Agency>
  <Agency AgencyCode="BV" Eta="18" Count="4" /> 
  </Agency>
  </Stanze>
- <CriteriaReSearch>
- <Criterio>
- <Indirizzo>
  <Citta>ROMA</Citta> 
  <Nazione Codice="IT">Italia</Nazione> 
  </Indirizzo> 
  </Criterio>
  </CriteriaReSearch>
  </SegmentsRequest>
  </SegmentsRequests>
  </TEST>

Io nella chiamata della funzione in php ho fatto:

$input = array(array("xmlRequest"=>"AWE12"));

//chiamata al webservice

$trovato=$client->call('Funzione',$input);

Ho provato a passare qualsiasi cosa presente in quel file, ma con nessun input da risultati...

grazie.

ciao

Lore

risposto 10 anni fa
Lore
Lore
1
X 0 X

Ciao a tutti!

Scusate se riapro il topic, ma il titolo si adatta al problema che ho, per il quale, avendo fatto prima una ricerca, non ho trovato argomenti analoghi.

Ho creato dei servizi web in php seguendo i numerosi esempi trovati qua e la. Ebbene, funzionano senza problemi, ma l'unico vero tasto dolente e' la velocita' di richiesta risposta, nel senso che, misurando il tempo di risposta con un semplice benchmark, tutti i servizi web che ho creato, dal piu' semplice al piu' complesso, impiegano ben 15 secondi per restituire il risultato.

Li ho provati su macchine diverse, facendo diverse prove, ma il risultato non cambia.

L'idea che mi son fatto io, dato che durano 15 secondi tutti, e' che ci siano delle impostazioni da modificare, magari nel file php.ini o in qualche altro file.

Le info che posso dare sono che:

 - uso Linux Ubuntu

 - Apache 2.0

 - la libreria PEAR::SOAP

 - PHP 5

Fin dall'inizio, per testare i file php che scrivevo ho dovuto impostare ad infinito il timeout per il caricamento della pagina perche', impostato di default a 4 secondi, terminava con errore.

Vi ringrazio per l'aiuto, perche' non so davvero dove sbattere la testa.

Ho anche letto su internet che i servizi web in genere non sono molto veloci, ma 15 s sono comunque esagerati.

risposto 8 anni fa
AleK
AleK
1
X 0 X

15 secondi sono tantissimi, sopratutto se non stai inviando molti dati. Potresti effettuare il profiling del codice con xdebug e vedere dove lo script perde tempo.

Guarda qui:

http://devzone.zend.com/article/2899-Profiling-PHP-Applications-With-xdebug

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni, grazie per l'aiuto.  :)

Seguo il tuo link e spero di trovare il punto debole.  :bye:

risposto 8 anni fa
AleK
AleK
1
X 0 X

Eccomi di nuovo a scrivere.

Volevo farvi partecipi del fatto che ho risolto il problema. :)

Tutto era causato da un parametro impostato a 15 nel file apache2.conf all'interno della cartella etc/apache2.

Il parametro "incriminato" e' "KeepAliveTimeout", che rappresenta il numero di secondi che si deve attendere per la successiva richiesta da parte dello stesso client nella medesima connessione (piu' o meno in italiano suona cosi').

Infatti impostandolo a 0 il tempo di esecuzione e' sceso dai 15 secondi di partenza a circa 0,1 secondi, ottimo direi.

Vi ringrazio comunque per il suggerimento datomi, perche' essendo alle prime armi sara' in ogni caso uno strumento utilissimo.

Ciao a tutti.  :bye:

risposto 8 anni fa
AleK
AleK
1
X 0 X

perfetto, buono a sapersi  O0

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ciao a tutti,

ho lo stesso problema. E' la prima volta che affronto l'argomento e dovrei interrogare un web service.

Potete aiutarmi ?

Ho in mano un WSDL ed uno schema XSD dove sono descritti i vari parametri..

Pensavo di utilizzare del codice PHP.

Sarebbe interessante se Alex postasse del codice di esempio... che nel web non riesco a trovare qualcosa di chiaro... :-(

risposto un anno fa
fabry
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda