Foros del Web » Programando para Internet » PHP »

APORTE - Consumo de Webservices

Estas en el tema de APORTE - Consumo de Webservices en el foro de PHP en Foros del Web. Un Saludo. No me considero un experto en webservices, pero con la poca experiencia que he tenido, puedo dar un aporte que a mas de ...
  #1 (permalink)  
Antiguo 25/08/2010, 10:12
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Información APORTE - Consumo de Webservices

Un Saludo.
No me considero un experto en webservices, pero con la poca experiencia que he tenido, puedo dar un aporte que a mas de alguno le podra ser valioso a la hora de consumir web services. OJO estoy dando un aporte para CONSUMIR un ws y no para montar un server, lastimosamente no he tenido la experiencia de montar uno aun. Tomare como ejemplo el consumo de un webservice para loguearse a una pagina web x atraves de POO.
A ver, manos a la obra, para consumir un webservice lo primero que se necesita es un archivo con extension wsdl que te debe proporcionar la entidad que tiene el servidor, en este archivo, que no es mas que un xml, estan detalladas muchas cosas importantes, algunas se pueden leer a simple vista, otras es mas facil leerlas obteniendolas (mas abajo les muestro como), pero algo importante en este archivo para iniciar es tener la direccion donde sera consumido el wsdl, les pongo la siguiente parte de un wsdl como un ejemplo, y esta es la parte donde se define donde consumiremos el webservice

Código XML:
Ver original
  1. <wsdl:service name="miWebService">
  2.     <wsdl:port name="BasicHttpBinding_miWebService" binding="tns:BasicHttpBinding_miWebService">
  3.       <soap:address location="http://127.0.0.1:9091/miWebService/Services" />
  4.     </wsdl:port>
  5.   </wsdl:service>

Muchas veces, y casi siempre, cuando nos envian u obtenemos el wsdl, la direccion viene para local, y luego nos envian u obtenemos de otro lado la verdadera direccion, y con esto lo que debemos hacer es sustittuir esa direccion, por ejemplo, para dejarla asi

Código XML:
Ver original
  1. <wsdl:service name="miWebService">
  2.     <wsdl:port name="BasicHttpBinding_miWebService" binding="tns:BasicHttpBinding_miWebService">
  3.       <soap:address location="http://216.32.145.12:909/miWebService/Services" />
  4.     </wsdl:port>
  5.   </wsdl:service>

De esta forma, ya podremos consumir el web service.
Ahora bien, que mas necesitamos? necesitamos conocer los metodos/funciones y parametros, algunas veces nos lo pueden proporcionar, otras no, y la mayoria de las veces no se entiende que nos estan pasando, asi que para obtener esta info y tambien para depurar el consumo del ws, les dejo este codigo:

Código PHP:
Ver original
  1. print "<pre>\n";
  2.             print "Request :       \n". ($ws->__getLastRequest())  ."\n";
  3.             print "RequestHeaders :\n". $ws->__getLastRequestHeaders()             ."\n";
  4.             print "Response:       \n". ($ws->__getLastResponse()) ."\n";
  5.             print "ResponseHeaders:\n". $ws->__getLastResponseHeaders()            ."\n";
  6.             print "Functions:      \n". var_export($ws->__getFunctions(),true)     ."\n";
  7.             print "Types:          \n". var_export($ws->__getTypes(),true)         ."\n";
  8.             print "</pre>";

Si se ejecuta sin realizar una llamada al ws, unicamente nos devolvera la lista de funciones y parametros.
Ahora bien, como nos conectamos al webservice? yo lo estoy haciendo utilizando las funciones SOAP que php tiene ya implementadas (NO ESTOY USANDO NUSOAP) y para definir el wsdl que vamos a utilizar se utiliza SoapClient de la siguiente manera:

Código PHP:
Ver original
  1. $wsdl='miWebservice.wsdl';
  2. $ws = new SoapClient($wsdl,array("exceptions" => 1, 'trace'=>1, ));

Nota: agregamos array("exceptions" => 1, 'trace'=>1, ) para que nos devuelva los metodos y parametros, de lo contrario, no es necesario utilizarlo.

Muy bien, pero lo mas dificil, como le paso los parametros?
Bueno, esta parte ha sido lo mas dificil para mi, ya que nadie te explica ni te dice con claridad como enviar los parametros y como recibirlos, pero al obtener los metodos y funciones, esto se nos simplifica un poco, de esta manera, suponiendo que todo el codigo que he puesto esta bien configurado y el wsdl tambien, podemos usar lo siguiente para obtener los metodos y funciones:

Código PHP:
Ver original
  1. class SSON
  2.     {
  3.         public $wsdl;
  4.         public $request;
  5.         public $UsuarioInfo;
  6.         public $Code;
  7.         private function setWsdl($wsdl)
  8.         {
  9.             $this->wsdl='MiWebService.wsdl';
  10.         }
  11.        
  12.         public function __construct()
  13.         {
  14.             $this->setWsdl();
  15.         }
  16.  
  17.         public function LogIn($usuario,$password)
  18.         {
  19.             $this->request=array("user"=>$usuario,"password"=>$password);
  20.             $ws = new SoapClient($this->wsdl,array("exceptions" => 1, 'trace'=>1, ));
  21.             $req = $ws->__soapCall('LogonUser',array('LogonUser'=>$this->request));
  22.  
  23.             print "<pre>\n";
  24.             print "Request :       \n". ($ws->__getLastRequest())  ."\n";
  25.             print "RequestHeaders :\n". $ws->__getLastRequestHeaders()             ."\n";
  26.             print "Response:       \n". ($ws->__getLastResponse()) ."\n";
  27.             print "ResponseHeaders:\n". $ws->__getLastResponseHeaders()            ."\n";
  28.             print "Functions:      \n". var_export($ws->__getFunctions(),true)     ."\n";
  29.             print "Types:          \n". var_export($ws->__getTypes(),true)         ."\n";
  30.             print "</pre>";
  31.  
  32.  
  33.             $res = $req->LogonUserResult;
  34.             if ($res->Code==0)
  35.             {
  36.                 $this->setTicket($res->Ticket);
  37.                 if ($this->TicketIsValid())
  38.                 {
  39.                     $this->request=array("ticket"=>$this->ticket);
  40.                     $req = $ws->__soapCall('GetUserInfo',array('GetUserInfo'=>$this->request));
  41.  
  42.                     $res = $req->GetUserInfoResult;
  43.                     if ($res->Code==0)
  44.                     {
  45.                         $this->setUsuarioInfo($res->Info);
  46.                         return true;
  47.                     }
  48.                     else
  49.                     {
  50.                         return false;
  51.                     }
  52.                 }
  53.                 else
  54.                 {
  55.                     return false;
  56.                 }
  57.             }
  58.             else
  59.                 return false;
  60.         }//end function
  61.           }
  62.     $test = new SSON();
  63.     $usuario="miusuario";
  64.     $password="mpassword";
  65.     if ($test->LogIn($usuario,$password))
  66.     {
  67.         echo 'ok <br>';
  68.         echo 'Nombrer: '.$test->UsuarioInfo->Nombre;
  69.         echo '<br>Apellido: '.$test->UsuarioInfo->Apellido;
  70.         echo '<br>Fecha Nac: '.$test->UsuarioInfo->FechaNac;
  71.     }
  72.     else
  73.         echo 'Error en login';

Muy bien, al ejecutar este ejemplo, asumiendo que el wsdl esta bien configurado, nos deberia devolver algo como lo siguiente:

Código TEXT:
Ver original
  1. Request :      
  2.  
  3. miusuariomipassword
  4.  
  5. RequestHeaders :
  6. POST /laurldelwsdl HTTP/1.1
  7. Host: hostyportdelwsdl
  8. Connection: Keep-Alive
  9. User-Agent: PHP-SOAP/5.1.6
  10. Content-Type: text/xml; charset=utf-8
  11. SOAPAction: "http://miwebservice/LogonUser"
  12. Content-Length: 335
  13.  
  14. Response:      
  15. 0OK23974326-da86-4adc-845b-75abf0af8d91
  16. ResponseHeaders:
  17. HTTP/1.1 200 OK
  18. Connection: Keep-Alive
  19. Content-Length: 363
  20. Date: Wed, 25 Aug 2010 16:05:13 GMT
  21. Content-Type: text/xml; charset=utf-8
  22. Server: Microsoft-IIS/7.5
  23. X-Powered-By: ASP.NET
  24.  
  25. Functions:      
  26. array (
  27.   0 => 'TicketIsValidResponse TicketIsValid(TicketIsValid $parameters)',
  28.   1 => 'GetUserInfoResponse GetUserInfo(GetUserInfo $parameters)',
  29.   2 => 'LogonUserResponse LogonUser(LogonUser $parameters)',
  30.   3 => 'RegisterPersonUserResponse RegisterPersonUser(RegisterPersonUser $parameters)',
  31.   4 => 'ValidateUserRegistrationResponse ValidateUserRegistration(ValidateUserRegistration $parameters)',
  32.   5 => 'ExpireTicketResponse ExpireTicket(ExpireTicket $parameters)',
  33. )
  34. Types:          
  35. array (
  36.   0 => 'int char',
  37.   1 => 'duration duration',
  38.   2 => 'string guid',
  39.   3 => 'string ClientTypes',
  40.   4 => 'string UserStates',
  41.   5 => 'struct TicketIsValid {
  42.  string ticket;
  43. }',
  44.   6 => 'struct TicketIsValidResponse {
  45.  TicketIsValidResult TicketIsValidResult;
  46. }',
  47.   7 => 'struct TicketIsValidResult {
  48.  string Code;
  49.  boolean IsValid;
  50.  string Message;
  51. }',
  52.   8 => 'struct GetUserInfo {
  53.  string ticket;
  54. }',
  55.   9 => 'struct GetUserInfoResponse {
  56.  GetUserInfoResult GetUserInfoResult;
  57. }',
  58.   10 => 'struct GetUserInfoResult {
  59.  string Code;
  60.  UserInfo Info;
  61.  string Message;
  62. }',
  63.   11 => 'struct UserInfo {
  64.  ClientTypes ClientType;
  65.  string Email;
  66.  string FantasyName;
  67.  boolean IsClient;
  68.  string MovilePhone;
  69.  string Name;
  70.  string Sex;
  71.  dateTime BirthDate;
  72.  ArrayOfUserProductInfo Products;
  73.  base64Binary ProfileImage;
  74.  UserStates Status;
  75.  string SurName;
  76. }',
  77.   12 => 'struct ArrayOfUserProductInfo {
  78.  UserProductInfo UserProductInfo;
  79. }',
  80.   13 => 'struct UserProductInfo {
  81.  string Description;
  82.  boolean IsContactLine;
  83.  string ProductCode;
  84. }',
  85.   14 => 'struct LogonUser {
  86.  string user;
  87.  string password;
  88. }',
  89.   15 => 'struct LogonUserResponse {
  90.  LogonUserResult LogonUserResult;
  91. }',
  92.   16 => 'struct LogonUserResult {
  93.  string Code;
  94.  string Message;
  95.  string Ticket;
  96. }',
  97.   17 => 'struct RegisterPersonUser {
  98.  PersonRegistrationInfo newUserInfo;
  99. }',
  100.   18 => 'struct PersonRegistrationInfo {
  101.  string Address;
  102.  dateTime BirthDate;
  103.  string DocumentId;
  104.  int DocumentTypeId;
  105.  string Email;
  106.  boolean IsClient;
  107.  string Locality;
  108.  string MobilePhone;
  109.  string Name;
  110.  string Neighborhood;
  111.  string Password;
  112.  string Sex;
  113.  string Surname;
  114. }',
  115.   19 => 'struct RegisterPersonUserResponse {
  116.  RegisterPersonUserResult RegisterPersonUserResult;
  117. }',
  118.   20 => 'struct RegisterPersonUserResult {
  119.  string Code;
  120.  string Message;
  121.  long RegistrationTicket;
  122. }',
  123.   21 => 'struct ValidateUserRegistration {
  124.  long registrationTicket;
  125.  string validationToken;
  126. }',
  127.   22 => 'struct ValidateUserRegistrationResponse {
  128.  ValidateUserRegistrationResult ValidateUserRegistrationResult;
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.
  #2 (permalink)  
Antiguo 25/08/2010, 10:12
Avatar de xcars  
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 18 años, 11 meses
Puntos: 4
Respuesta: APORTE - Consumo de Webservices

En el ejemplo que he puesto, basicamente primero se loguea el usuario, y con este logueo nos devuelven un numero de ticket, y luego con el ticket obtenemos la info del usuario, por eso es que hacemos dos llamadas a 2 funciones diferentes.
Y luego de la parte de request y response, nos detalla las funciones y parametros a utilizar, si nos fijamos bien, yo utilice una llamada "LogonUser" la cual tiene como parametro de salida "LogonUserResponse", ver esta linea

Código PHP:
Ver original
  1. 2 => 'LogonUserResponse LogonUser(LogonUser $parameters)',

Y luego mas abajo nos dice como se envian los parametros y como los recibimos, ver:
Código PHP:
Ver original
  1. 14 => 'struct LogonUser {
  2. string user;
  3. string password;
  4. }',
  5.   15 => 'struct LogonUserResponse {
  6. LogonUserResult LogonUserResult;
  7. }',
  8.   16 => 'struct LogonUserResult {
  9. string Code;
  10. string Message;
  11. string Ticket;

Por lo tanto debemos enviar un array con el parametro "user" y "password" y luego este array se contiene en otro con el nombre "LogonUser", para entender mejor, ver la parte del codigo siguiente:
Código PHP:
Ver original
  1. $this->request=array("user"=>$usuario,"password"=>$password);
  2. $req = $ws->__soapCall('LogonUser',[B]array('LogonUser'=>$this->request))[/B];

Ahora bien, cuando queremos obtener el resultado, este viene como un objeto tambien, en nuestro caso con 3 parametros, y para acceder lo hacemos asi:
Código PHP:
Ver original
  1. $res = $req->LogonUserResult;
  2. $CodigoRespuesta=$res->Code;
  3. $Mensaje=$res->Message;
  4. $Ticket=$res->Ticket;

Ojo, hay que respetar minusculas y mayusculas.
Creo qeu es todo por el momento, si hay algo mas que sienta que se me escapo editare el post, y espero que le sea util a alguien.
__________________
Con Microaplicaciones puedes hacer tu tienda en línea de forma sencilla y rápida, sin costos ocultos y con mucha responsabilidad.

Etiquetas: aportes, webservice
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:15.