Revista Comunicación

Consumir webservice de Drupal desde PHP

Publicado el 23 julio 2013 por Xarmengol @xarmengol

Con esta entrada veremos la forma (una forma) de consumir desde PHP un servicio web publicado mediante Drupal. Lo haremos usando la librería Client URL, cURL, que es una implementación de libcurl para PHP, y que nos permite hacer todo tipo de peticiones desde PHP.

El servicio web en cuestión publicado desde Drupal, es de tipo RESTful, y la particularidad más destacada que tiene es que la autenticación funciona mediante cookie. Esto significa que toda llamada a una función de ese servicio web debe llevar consigo una cookie con una sesion establecida previamente con el servidor

Entonces el procedimiento cuando queremos hacer una petición a una función del servicio, inicialmente haremos una primera petición para autenticarnos y obtener una cookie con la sesión. Una vez hecho esto ya podremos hacer la petición a la función que queramos del sevicio, adjuntando la cookie que hemos obtenido en la petición de autenticación. 

 

El código 

Vamos a ver el código en cuestión: 

<?php
    ///////////////////////////////////////////////////////////////////////
    // Código de ejemplo para llamar a un servicio web publicada con Drupal.
    // Se trata de un servicio de tipo REST, autenticado mediante cookie.
    ///////////////////////////////////////////////////////////////////////
    

    ///////////////////////////////////////////////////////////////////////
    // Primera petición, para autenticarnos y obtener la cookie de sesion
    ///////////////////////////////////////////////////////////////////////
​    $crl = curl_init();
    $urlLogin = "http://example.com/user/login";
    $postdata=array(
        "name"=>"user_name", 
        "pass"=>"user_password",
        "form_id"=>"user_login", 
        "op"=>"Log in"
    );
    
    // URL donde hacer la petición
    curl_setopt($crl, CURLOPT_URL, $urlLogin);
    curl_setopt($crl, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    curl_setopt($crl, CURLOPT_COOKIEJAR, "/tmp/cookies/curlCookie.txt");
    curl_setopt($crl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1);
    // Indicamos que vamos a hacer una petición de tipo POST
    curl_setopt($crl, CURLOPT_POST, 1);
    // Y pasamos los parámetros de la llamada post, que es basicamente
    // la variable $postdata que hemos creado al inicio    
    curl_setopt ($crl, CURLOPT_POSTFIELDS, $postdata);    
    // Ejecutamos la llamada
    $result=curl_exec($crl);
    // Para terminar esta primera llamada, nos aseguramos que hemos 
    // podido acceder correctamente, y estamos dentro
    $headers = curl_getinfo($crl);
    if ($headers['url'] == $url) {
        die("Cannot login.");
    }     
    // Si no ha habido imprevistos, cerramos esta primera petición
    curl_close ($crl); 
    

    ///////////////////////////////////////////////////////////////////////
    // Ahora que ya tenemos la cookie guardada de la petición anterior, 
    // hacemos la segunda petición y llamamos a la función del servicio web. 
    ///////////////////////////////////////////////////////////////////////
    $ch = curl_init(); 
    // Url de la petición del servicio web
    $RequestUrl = "http://example.com/samples/get_created_samples.json";
    curl_setopt($ch, CURLOPT_URL,$RequestUrl);    
    // Este parámetro hace que al ejecutar la petición, la función devuelva  
    // la respuesta de la misma
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // Lo más importante! Pasamos la cookie que hemos obtenido con la 
    // petición inicial    
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    // Ejecutamos la llamada 
    $result = curl_exec ($ch);
    // Ya tenemos los resultados en $result, podemos cerrar la petición 
    curl_close ($ch); 
   
    // Con la funcion json_decode de PHP pasamos del String de json a un 
    // array con el que trabajar mejor con los datos    
    $json_array = json_decode($result, true);
    foreach ($json_array as $json_object){
        echo ("<b>Nom:</b> ".utf8_decode($json_object['surname']."<br/>"));
        echo ("<b>Cognoms:</b> ".utf8_decode($json_object['lastname']."<br/>"));
        echo ("<b>Ciutat:</b> ".utf8_decode($json_object['city']."<br/>"));        
    }
    
?>

 

Haciendo las peticiones detrás de un proxy

En nuestro caso, tuvimos que añadir adicionalmente la configuración del proxy de nuestra red, puesto que para salir a Internet lo hacemos mediante un servidor proxy. Para hacer esto, simplemente añadimos dos opciones más al objeto curl: la url del proxy y su puerto: 

    $ch = curl_init(); 
    $RequestUrl = "http://example.com/samples/get_created_samples.json";
    // Configuración del proxy
    curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.edu");
    curl_setopt($ch, CURLOPT_PROXYPORT, "8080");
    curl_setopt($ch, CURLOPT_URL,$RequestUrl);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    $result = curl_exec($ch);
    curl_close ($ch); 

Y esto es todo. 

Categorias: 

  • PHP
  • Drupal

Volver a la Portada de Logo Paperblog