Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/08/2010, 10:12
Avatar de xcars
xcars
 
Fecha de Ingreso: mayo-2005
Ubicación: El Salvador
Mensajes: 753
Antigüedad: 19 años
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.