<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zend Framework Italy &#187; Script</title>
	<atom:link href="http://www.zend-framework.it/category/script/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zend-framework.it</link>
	<description>Just another Zend Framework (Italian) weblog.</description>
	<lastBuildDate>Wed, 15 Apr 2009 07:18:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Scaricare il contenuto di una pagina con Zend_Http_Client</title>
		<link>http://www.zend-framework.it/2008/01/09/scaricare-il-contenuto-di-una-pagina-con-zend_http_client/</link>
		<comments>http://www.zend-framework.it/2008/01/09/scaricare-il-contenuto-di-una-pagina-con-zend_http_client/#comments</comments>
		<pubDate>Wed, 09 Jan 2008 08:30:51 +0000</pubDate>
		<dc:creator>weppos</dc:creator>
				<category><![CDATA[Script]]></category>
		<category><![CDATA[Zend_Exception]]></category>
		<category><![CDATA[Zend_Http_Client]]></category>
		<category><![CDATA[Zend_Http_Response]]></category>
		<category><![CDATA[Zend_Uri]]></category>
		<category><![CDATA[Zend_Uri_Http]]></category>

		<guid isPermaLink="false">http://www.zend-framework.it/2008/01/09/scaricare-il-contenuto-di-una-pagina-con-zend_http_client/</guid>
		<description><![CDATA[Utilizzo di Zend_Http_Client per creare un semplice parser di pagine web che mostri il contenuto e gli header della pagina recuperata.]]></description>
			<content:encoded><![CDATA[<p>Zend_Http_Client è un componente di <a href="/tag/zend-framework/">Zend Framework</a> estremamente importante, alla base di tutti i componenti di Zend_Service, ma non solo.<br />
Come rivela il nome, si tratta di un <strong>Client HTTP scritto completamente in PHP</strong>.</p>
<p>Molti di voi conosceranno <a href="http://www.php.net/curl">cURL</a>, anch&#8217;esso un HTTP Client disponibile per PHP.<br />
Sebbene sia molto diffuso, non tutte le configurazioni di PHP prevedono questa libreria di default ed alcune impostazioni, come safe mode, potrebbero limitarne l&#8217;uso. Inoltre, è opinione diffusa che il suo utilizzo non sia troppo &#8220;elegante&#8221;.</p>
<p>Zend_Http_Client <strong>supporta quasi tutte le funzionalità di cURL</strong> e molti altri client HTTP: autenticazione, Cookie, CookieJar, redirect ed offre un completo set di metodi per analizzare la risposta HTTP ed il suo contenuto, il tutto con una sintassi object oriented.<br />
Zend_Http_Client fa largo uso del componente <a href="/tag/zend_uri/">Zend_Uri</a>, in particolare della sua sottoclasse specifica <a href="/tag/zend_uri_http/">Zend_Uri_Http</a>, per manipolare le URL.</p>
<p>Nell&#8217;esempio seguente vediamo come <strong>recuperare un semplice contenuto di una pagina tramite una richiesta HTTP GET</strong>, stamparne gli header ed il contenuto se la risposta va a buon fine.<br />
Per complicare leggermente lo script, l&#8217;URL viene recuperato da una form e validato sfruttando uno degli approcci già descritti nell&#8217;articolo <a href="/2008/01/07/validare-un-url-in-php-con-zend_uri/">Validare un URL in PHP con Zend_Uri</a>.<span id="more-17"></span></p>
<pre class="brush: php;">&lt;?php

// includi la libreria
require_once 'Zend/Http/Client.php';

if (isset($_GET['url'])) {
    try {
        // esegui il parsing dell'URL
        $uri = Zend_Uri::factory(trim($_GET['url']));

        // useragent personalizzata
        $useragent = 'TestClient/1.0';

        // crea un nuovo client HTTP ed imposta le configurazioni
        $httpClient = new Zend_Http_Client();
        $httpClient-&gt;setConfig(array('useragent' =&gt; $useragent));
        $httpClient-&gt;setUri($uri);

        // invia la richiesta HTTP
        $response = $httpClient-&gt;request();

        // controlla la risposta
        if (!$response-&gt;isSuccessful()) {
            // genera un'eccezione in caso di status HTTP non valido
            throw new Zend_Http_Client_Exception('HTTP ' . $response-&gt;getStatus() . ' - ' . $response-&gt;getMessage());
        }

        echo &quot;&lt;h1&gt;&quot; . $uri . &quot;&lt;/h1&gt;&quot;;
        echo &quot;&lt;h2&gt;Headers:&lt;/h2&gt;&quot;;
        echo &quot;&lt;pre&gt;&quot;;
        foreach($response-&gt;getHeaders() as $name =&gt; $value) {
            echo &quot;$name: $value\n&quot;;
        }
        echo &quot;&lt;/pre&gt;&quot;;

        // stampa il contenuto della pagina in una textaread
        echo &quot;&lt;h2&gt;Content:&lt;/h2&gt;&quot;;
        echo &quot;&lt;textarea cols=\&quot;80\&quot; rows=\&quot;80\&quot;&gt;&quot; . $response-&gt;getBody() . &quot;&lt;/textarea&gt;&quot;;

    } catch(Zend_Exception $e) {
        echo &quot;&lt;h1&gt;Error: &quot; . $e-&gt;getMessage() . &quot;&lt;/h1&gt;&quot;;
    }
}

?&gt;
&lt;form&gt;
&lt;p&gt;
&lt;input type=&quot;text&quot; name=&quot;url&quot; value=&quot;http://&quot; /&gt;
&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;fetch!&quot; /&gt;
&lt;/p&gt;
&lt;/form&gt;
</pre>
<p>Lo script è molto essenziale e <strong>non è stato sviluppato tenendo in cosiderazione alcun principio alla base del design pattern MVC</strong>.<br />
L&#8217;implementazione di un progetto MVC è, al momento, oltre lo scopo di questo semplice script.</p>
<p>Il codice è commentato a sufficienza, tuttavia ci sono alcuni aspetti che può essere utile commentare insieme.</p>
<h2>Uso delle eccezioni in un codice procedurale</h2>
<p>Innanzi tutto da notare l&#8217;uso di un unico blocco <code>try...catch</code> per <strong>gestire a monte qualsiasi eccezione generata dai componenti di Zend</strong>.<br />
Sfruttando le eccezioni di PHP 5 è possibile evitare noiosi e ripetitivi controlli e rendere il codice più fluido, anche se scritto in modo procedurale.<br />
Inoltre, possiamo sfruttare il blocco per lanciare noi stessi un&#8217;eccezione in caso sia necessario interrompere l&#8217;elaborazione (nel nostro caso se una risposta contiene uno status HTTP diverso da 200 o 304).</p>
<p>Le seguenti esecuzioni parte dello Zend Framework possono generare un&#8217;eccezione:</p>
<ol>
<li><code>Zend_Uri::factory(trim($_GET['url']))</code> in caso l&#8217;URL fornito non sia valido</li>
<li><code>$response = $httpClient-&gt;request();</code> in caso la richiesta HTTP non vada a buon fine, ad esempio se la connessione internet non è disponibile</li>
</ol>
<p>Poiché qualsiasi eccezione lanciata da un componente dello Zend Framework estende <code>Zend_Exception</code>, è sufficiente indicare a PHP di catturare una qualsiasi eccezione figlia di questa classe.</p>
<h2>Impostazioni personalizzate</h2>
<p>Zend_Client_Http consente di <strong>inviare intestazioni (header) personalizzate</strong>.<br />
Tra gli header, quello senz&#8217;altro più famoso è la stringa <strong>User Agent</strong> che spesso indica univocamente il tipo di client in uso: browser come Mozilla Firefox o Internet Explorer, crawler come Yahoo! Slurp o Googlebot&#8230;</p>
<p>Nel nostro caso abbiamo scelto di <strong>identificare il nostro client</strong> con la stringa <code>'TestClient/1.0'</code>.<br />
Nei log del server le nostre richieste figureranno quindi associate a questa user agent.</p>
<h2>Non è MVC!</h2>
<p>Sebbene Zend Framework sia un framework MVC, come già anticipato, questo argomento è oltre allo scopo di questo script e si è adottata una soluzione procedurale per rendere il tutorial più sintetico ed immediato.</p>
<p>Non sempre l&#8217;architettura MVC riflette al meglio le esigenze di chi sviluppa&#8230; questo era uno di quei casi! <img src='http://www.zend-framework.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.zend-framework.it/2008/01/09/scaricare-il-contenuto-di-una-pagina-con-zend_http_client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validare un URL in PHP con Zend_Uri</title>
		<link>http://www.zend-framework.it/2008/01/07/validare-un-url-in-php-con-zend_uri/</link>
		<comments>http://www.zend-framework.it/2008/01/07/validare-un-url-in-php-con-zend_uri/#comments</comments>
		<pubDate>Mon, 07 Jan 2008 00:21:40 +0000</pubDate>
		<dc:creator>weppos</dc:creator>
				<category><![CDATA[Script]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[validazione]]></category>
		<category><![CDATA[Zend_Uri]]></category>
		<category><![CDATA[Zend_Uri_Http]]></category>

		<guid isPermaLink="false">http://www.zend-framework.it/2008/01/07/validare-un-url-in-php-con-zend_uri/</guid>
		<description><![CDATA[Come validare il formato di un URL in PHP utilizzando la libreria Zend_Uri.]]></description>
			<content:encoded><![CDATA[<p><code>Zend_Uri</code> è una delle <a href="/2007/12/30/funzionalita-dello-zend-framework/">molteplici librerie</a> messe a disposizione dallo Zend Framework.<br />
Nasce sostanzialmente come componente a supporto delle altre librerie del framework per la rappresentazione dei diversi tipi di URI, sebbene possa essere utilizzato anche da solo, come vedremo in questo esempio.</p>
<p>Attualmente, la distribuzione di <code>Zend_Uri</code> contenuta nella versione 1.0.3 dello Zend Framework supporta esclusivamente gli schemi HTTP e HTTPS, ma questo è più che sufficiente per il nostro scopo: <strong>validare il formato di un URL utilizzando PHP</strong>.</p>
<p>Vediamo un esempio concreto.<span id="more-13"></span></p>
<pre class="brush: php;">&lt;?php

// includi la libreria
require_once 'Zend/Uri.php';

// valida l'URL
$valid = Zend_Uri::check('http://www.zend-framework.it/page.php');

if ($valid) {
  echo 'Valido';
} else {
  echo 'Invalido';
}
</pre>
<p>Questa è senz&#8217;altro la soluzione più comoda.<br />
Grazie al metodo statico <code>Zend_Uri::check()</code> è possibile validare un URI. Nel caso l&#8217;URI passato non sia valido, <code>$valid</code> assumerà valore <code>FALSE</code>.</p>
<p>Nel caso in cui si desideri manipolare l&#8217;URL in seguito può essere utile utilizzare tentare di costruire un nuovo oggetto URI e catturare l&#8217;eccezione restituita dal metodo <code>Zend_Uri::factory()</code>.</p>
<pre class="brush: php;">&lt;?php

// includi la libreria
require_once 'Zend/Uri.php';

// costruisci un nuovo URI
try {
  $uri = Zend_Uri::factory('http://www.zend-framework.it/page.php');
} catch(Zend_Uri_Exception $e) {
  echo &quot;URI invalido: &quot; . $e-&gt;getMessage();
}
</pre>
<p>Nel caso in cui l&#8217;URI fornito sia valido, <code>$uri</code> conterrà una nuova istanza di un oggetto <code>Zend_Uri</code> specifico, ad esempio nel nostro caso <code>Zend_Uri_Http</code>.<br />
Ecco l&#8217;output prodotto dal comando <code>print_r($uri)</code>:</p>
<pre class="brush: php;">Zend_Uri_Http Object
(
  [_username:protected] =&gt;
  [_password:protected] =&gt;
  [_host:protected] =&gt; www.zend-framework.it
  [_port:protected] =&gt;
  [_path:protected] =&gt; /page.php
  [_query:protected] =&gt;
  [_fragment:protected] =&gt;
  [_regex:protected] =&gt; Array
  (
    [alphanum] =&gt; [^\W_]
    [escaped] =&gt; (?:%[\da-fA-F]{2})
    [mark] =&gt; [-_.!~*'()\[\]]
    [reserved] =&gt; [;\/?:@&amp;=+$,]
    [unreserved] =&gt; (?:[^\W_]|[-_.!~*'()\[\]])
    [segment] =&gt; (?:(?:(?:[^\W_]|[-_.!~*'()\[\]])|(?:%[\da-fA-F]{2})|[:@&amp;=+$,;])*)
    [path] =&gt; (?:\/(?:(?:(?:[^\W_]|[-_.!~*'()\[\]])|(?:%[\da-fA-F]{2})|[:@&amp;=+$,;])*)?)+
    [uric] =&gt; (?:[;\/?:@&amp;=+$,]|(?:[^\W_]|[-_.!~*'()\[\]])|(?:%[\da-fA-F]{2}))
  )
  [_scheme:protected] =&gt; http
)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.zend-framework.it/2008/01/07/validare-un-url-in-php-con-zend_uri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
