Chapter 11. Zend_Http

Table of Contents

11.1. Zend_Http_Client - Introduction
11.1.1. Introduction
11.1.2. Configuration Parameters
11.1.3. Performing Basic HTTP Requests
11.1.4. Adding GET and POST parameters
11.2. Zend_Http_Client - Advanced Usage
11.2.1. HTTP Redirections
11.2.2. Adding Cookies and Using Cookie Persistence
11.2.3. Setting Custom Request Headers
11.2.4. File Uploads
11.2.5. Sending Raw POST Data
11.2.6. HTTP Authentication
11.2.7. Sending Multiple Requests With the Same Client
11.3. Zend_Http_Client - Connection Adapters
11.3.1. Overview
11.3.2. The Socket Adapter
11.3.3. The Proxy Adapter
11.3.4. The Test Adapter
11.3.5. Creating your own connection adapters
11.4. Zend_Http_Cookie and Zend_Http_CookieJar
11.4.1. Introduction
11.4.2. Instantiating Zend_Http_Cookie Objects
11.4.3. Zend_Http_Cookie getter methods
11.4.4. Zend_Http_Cookie: Matching against a scenario
11.4.5. The Zend_Http_CookieJar Class: Instantiation
11.4.6. Adding Cookies to a Zend_Http_CookieJar object
11.4.7. Retrieving Cookies From a Zend_Http_CookieJar object
11.5. Zend_Http_Response
11.5.1. Introduction
11.5.2. Boolean Tester Methods
11.5.3. Accessor Methods
11.5.4. Static HTTP Response Parsers

11.1. Zend_Http_Client - Introduction

11.1.1. Introduction

Zend_Http_Client provides an easy interface for preforming Hyper-Text Transfer Protocol (HTTP) requests. Zend_Http_Client supports most simple features expected from an HTTP client, as well as some more complex features such as HTTP authentication and file uploads. Successful requests (and most unsuccessful ones too) return a Zend_Http_Response object, which provides access to the response's headers and body (see Section 11.5, “Zend_Http_Response”).

The class constructor optionally accepts a URL as it's first parameter (can be either a string or a Zend_Uri_Http object), and an optional array of configuration parameters. Both can be left out, and set later using the setUri() and setConfig() methods.

Example 11.1. Instantiating a Zend_Http_Client object

<?php
    require_once 'Zend/Http/Client.php';

    $client = new Zend_Http_Client('http://example.org', array(
        'maxredirects' => 0,
        'timeout'      => 30));
        
    // This is actually exactly the same:
    $client = new Zend_Http_Client();
    $client->setUri('http://example.org');
    $client->setConfig(array(
        'maxredirects' => 0,
        'timeout'      => 30));

?>

11.1.2. Configuration Parameters

The constructor and setConfig() method accept an associative array of configuration parameters. Setting these parameters is optional, as they all have default values.

Table 11.1. Zend_Http_Client configuration parameters

Parameter Description Expected Values Default Value
maxredirects Maximum number of redirections to follow (0 = none) integer 5
strictredirects Whether to strictly follow the RFC when redirecting (see Section 11.2.1, “HTTP Redirections”) boolean false
useragent User agent identifier string (sent in request headers) string 'Zend_Http_Client'
timeout Connection timeout (seconds) integer 10
httpversion HTTP protocol version float (1.1 or 1.0) 1.1
adapter Connection adapter class to use (see Section 11.3, “Zend_Http_Client - Connection Adapters”) mixed 'Zend_Http_Client_Adapter_Socket'
keepalive Whether to enable keep-alive connections with the server. Useful and might improve performance if several consecutive requests to the same server are performned. boolean false

11.1.3. Performing Basic HTTP Requests

Performing simple HTTP requests is very easily done using the request() method, and rarely needs more than three lines of code:

Example 11.2. Preforming a Simple GET Request

<?php
    require_once 'Zend/Http/Client.php';

    $client = new Zend_Http_Client('http://example.org');
    $response = $client->request();
?>

The request() method takes one optional parameter - the request method. This can be either GET, POST, PUT, HEAD, DELETE, TRACE, OPTIONS or CONNECT as defined by the HTTP protocol [1]. For convenience, these are all defined as class constants: Zend_Http_Request::GET, Zend_Http_Request::POST and so on.

If no method is specified, the method set by the last setMethod() call is used. If setMethod() was never called, the default request method is GET (see the above example).

Example 11.3. Using Request Methods Other Than GET

<?php
    // Preforming a POST request
    $response = $client->request('POST');
    
    // Yet another way of preforming a POST request
    $client->setMethod(Zend_Http_Client::POST);
    $response = $client->request();
?>

11.1.4. Adding GET and POST parameters

Adding GET parameters to an HTTP request is quite simple, and can be done either by specifying them as part of the URL, or by using the setParameterGet() method. This method takes the GET parameter's name as it's first parameter, and the GET parameter's value as it's second parameter. For convenience, the setParameterGet() method can also accept a single associative array of name => value GET variables - which may be more comfortable when several GET parameters need to be set.

Example 11.4. Setting GET Parameters

<?php
    // Setting a get parameter using the setParameterGet method
    $client->setParameterGet('knight', 'lancelot');

    // This is equivalent to setting such URL:
    $client->setUri('http://example.com/index.php?knight=lancelot');
    
    // Adding several parameters with one call
    $client->setParameterGet(array(
        'first_name'  => 'Bender',
        'middle_name' => 'Bending'
        'made_in'     => 'Mexico',
    ));
?>

While GET parameters can be sent with every request method, POST parameters are only sent in the body of POST requests. Adding POST parameters to a request is very similar to adding GET parameters, and can be done with the setParameterPost() method, which is similar to the setParameterGet() method in structure.

Example 11.5. Setting POST Parameters

<?php
    // Setting a POST parameter
    $client->setParameterPost('language', 'fr');
    
    // Setting several POST parameters, one of them with several values
    $client->setParameterPost(array(
        'language'  => 'es',
        'country'   => 'ar',
        'selection' => array(45, 32, 80)
    ));
?>

Note that when sending POST requests, you can set both GET and POST parameters. On the other hand, while setting POST parameters for a non-POST request will not trigger and error, it is useless. Unless the request is a POST request, POST parameters are simply ignored.