TigerZF
🌐Español

60.2. Zend_Rest_Client

60.2.1. Introducción

Usar Zend_Rest_Client es muy similar a usar objetos SoapClient (extensión de servicios web SOAP). Simplemente puede llamar a los procedimientos del servicio REST como métodos de Zend_Rest_Client. Especifique la dirección completa del servicio en el constructor de Zend_Rest_Client.

Ejemplo 60.1. Una petición REST básica

/**
 * Connect to framework.zend.com server and retrieve a greeting
 */
$client = new Zend_Rest_Client('http://framework.zend.com/rest');

echo $client->sayHello('Davey', 'Day')->get(); // "Hello Davey, Good Day"

[Note] Diferencias en la forma de llamar

Zend_Rest_Client intenta hacer que los métodos remotos se parezcan lo más posible a métodos nativos, siendo la única diferencia que debe seguir la llamada al método con uno de get(), post(), put() o delete(). Esta llamada puede hacerse mediante encadenamiento de métodos o en llamadas a métodos separadas:

$client->sayHello('Davey', 'Day');
echo $client->get();

60.2.2. Respuestas

Todas las peticiones realizadas usando Zend_Rest_Client devuelven un objeto Zend_Rest_Client_Response. Este objeto tiene muchas propiedades que facilitan el acceso a los resultados.

Cuando el servicio se basa en Zend_Rest_Server, Zend_Rest_Client puede hacer varias suposiciones sobre la respuesta, incluyendo el estado de la respuesta (éxito o fallo) y el tipo de retorno.

Ejemplo 60.2. Estado de la respuesta

$result = $client->sayHello('Davey', 'Day')->get();

if ($result->isSuccess()) {
    echo $result; // "Hello Davey, Good Day"
}

En el ejemplo anterior, puede ver que usamos el resultado de la petición como un objeto, para llamar a isSuccess(), y luego, gracias a __toString(), podemos simplemente hacer echo del objeto para obtener el resultado. Zend_Rest_Client_Response le permitirá hacer echo de cualquier valor escalar. Para tipos complejos, puede usar la notación de array o de objeto.

Si, en cambio, desea consultar un servicio que no usa Zend_Rest_Server, el objeto Zend_Rest_Client_Response se comportará más como un SimpleXMLElement. Sin embargo, para facilitar las cosas, consultará automáticamente el XML usando XPath si la propiedad no es un descendiente directo del elemento raíz del documento. Además, si accede a una propiedad como un método, recibirá el valor PHP para el objeto, o un array de resultados de valores PHP.

Ejemplo 60.3. Uso del servicio Rest de Technorati

$technorati = new Zend_Rest_Client('http://api.technorati.com/bloginfo');
$technorati->key($key);
$technorati->url('http://pixelated-dreams.com');
$result = $technorati->get();
echo $result->firstname() .' '. $result->lastname();

Ejemplo 60.4. Ejemplo de respuesta de Technorati

<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Technorati API version 1.0 /bloginfo" -->
<!DOCTYPE tapi PUBLIC "-//Technorati, Inc.//DTD TAPI 0.02//EN"
                      "http://api.technorati.com/dtd/tapi-002.xml">
<tapi version="1.0">
    <document>
        <result>
            <url>http://pixelated-dreams.com</url>
            <weblog>
                <name>Pixelated Dreams</name>
                <url>http://pixelated-dreams.com</url>
                <author>
                    <username>DShafik</username>
                    <firstname>Davey</firstname>
                    <lastname>Shafik</lastname>
                </author>
                <rssurl>
                    http://pixelated-dreams.com/feeds/index.rss2
                </rssurl>
                <atomurl>
                    http://pixelated-dreams.com/feeds/atom.xml
                </atomurl>
                <inboundblogs>44</inboundblogs>
                <inboundlinks>218</inboundlinks>
                <lastupdate>2006-04-26 04:36:36 GMT</lastupdate>
                <rank>60635</rank>
            </weblog>
            <inboundblogs>44</inboundblogs>
            <inboundlinks>218</inboundlinks>
        </result>
    </document>
</tapi>

Aquí estamos accediendo a las propiedades firstname y lastname. Aunque no son elementos de primer nivel, se devuelven automáticamente al ser accedidos por su nombre.

[Note] Elementos múltiples

Si se encuentran múltiples elementos al acceder a un valor por nombre, se devolverá un array de SimpleXMLElements; el acceso mediante notación de método devolverá un array de valores PHP.

60.2.3. Argumentos de la petición

A menos que esté realizando una petición a un servicio basado en Zend_Rest_Server, es probable que necesite enviar múltiples argumentos con su petición. Esto se hace llamando a un método con el nombre del argumento, pasando el valor como primer (y único) argumento. Cada una de estas llamadas a métodos devuelve el propio objeto, permitiendo el encadenamiento, o un uso "fluido". Se asume siempre que la primera llamada, o el primer argumento si pasa más de uno, es el método al llamar a un servicio Zend_Rest_Server.

Ejemplo 60.5. Establecimiento de argumentos de la petición

$client = new Zend_Rest_Client('http://example.org/rest');

$client->arg('value1');
$client->arg2('value2');
$client->get();

// or

$client->arg('value1')->arg2('value2')->get();

Ambos métodos del ejemplo anterior darán como resultado los siguientes argumentos get: ?method=arg&arg1=value1&arg=value1&arg2=value2

Notará que la primera llamada de $client->arg('value1'); dio como resultado tanto method=arg&arg1=value1 como arg=value1; esto es para que Zend_Rest_Server pueda entender la petición correctamente, en lugar de requerir un conocimiento previo de el servicio.

[Warning] Rigidez de Zend_Rest_Client

Cualquier servicio REST que sea estricto respecto a los argumentos que recibe probablemente fallará al usar Zend_Rest_Client, debido al comportamiento descrito anteriormente. Esto no es una práctica común y no debería causar problemas.