Hero

Como enviar un XML a un request POST sin un formulario con Drupal 7

Marzo 06, 2013

enzo
Drupal

Como es sabido los formulario HTML pueden procesarse usando los método GET o POST de HTTP y en Drupal usando el Form API podemos definir que metodo deseamos usando la propiedad #method.

Como es obvio el procesamiento de los formulario requiere interacción de parte del usuario, cuando estamos integrando Drupal con sistemas de terceros en ocasión necesitamos hacer llamados POST o GET mediante código y en la mayoría de las veces esto requiere verificación de usuarios, afortunadamente podemos usar la función provista por del core de Drupal drupal_http_request.

A continuación se puede apreciar un ejemplo de un de un POST a un servicio externo el cual tiene HTTP Authentication y enviamos un XML al servicio externo.

$user = 'jorge';
$pass = 'perez';

$url = 'http://' . $user . ':' . $pass . '@api.example.com/create';

$data = '<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
</catalog';

//Se define el método a usar, los datos y los headers 
$options = array(
    'method' => 'POST',
    'data' => $data,
    'headers' => array('Content-Type' => 'text/xml; charset=UTF-8'),
);

$response = drupal_http_request($url, $options);
 
if($response->code == '200') {
  drupal_set_message('Enviado creado satisfactoriamente');
} else {
  watchdog('DEBUG','error code:' . $response->code ); 
  watchdog('DEBUG','error message:' . $response->error );
  drupal_set_message('Error enviando datos','error');    
}

En el ejemplo anterior si deseáramos eliminar el envió de datos de verificación de usuarios, la URL quedara como sigue.

$url = 'http://api.example.com/create';

Además si en lugar de enviar un XML deseamos enviar datos normales de tipo formulario debemos cambiar la definición del arreglo $options donde cambiaremos el header, como se muestra a continuación.

$data = 'name=value&name1=value1';
$options = array(
                'method' => 'POST',
                'data' => $data,
                'timeout' => 15,
                'headers' => array('Content-Type' => 'application/x-www-form-urlencoded'),
        );

En la parte final del código de ejemplo hacemos uso del objeto que retorna la función drupal_http_request para determinar si el envió se proceso correctamente o si fallo.

El objecto retornado por la función drupal_http_request cuenta con las siguiente propiedades.

  • request: Cadena que contiene el cuerpo del request enviado.
  • code: Número entro que contiene el estado de la respuesta o el código de error.
  • protocol: El protocolo de respuesta por ejemplo HTTP/1.1 o HTTP/1.0.
  • status_message: Mensaje del estado de la respuesta, en caso de que se haya recibido el envió.
  • redirect_code: Si el request fue redirigido, contiene e número de estado del estado original antes de redireccionar.
  • redirect_url: Si el request fue redirigido, contiene la URL hacia donde fue redirigido.
  • error: Mensaje de error si ha ocurrido algún error.
  • headers: Arreglo que contiene los headers enviados como respuesta.
  • data: Cadena que contiene la respuesta del request.

Espero que haya sido de su agrado.

enzo

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.