Zend_Http_Client - Advanced Usage
HTTP Redirections
By default, Zend_Http_Client automatically handles HTTP redirections,
and will follow up to 5 redirections. This can be changed by setting
the 'maxredirects' configuration parameter.
According to the HTTP/1.1 RFC, HTTP 301 and 302 responses should be
treated by the client by resending the same request to the
specified location - using the same request method. However, most
clients to not implement this and always use a GET request when
redirecting. By default, Zend_Http_Client does the same - when
redirecting on a 301 or 302 response, all GET and POST parameters
are reset, and a GET request is sent to the new location. This
behavior can be changed by setting the 'strictredirects' configuration
parameter to boolean TRUE:
Forcing RFC 2616 Strict Redirections on 301 and 302 Responses
setConfig(array('strictredirects' => true));
// Non-strict Redirections
$client->setConfig(array('strictredirects' => false));
]]>
You can always get the number of redirections done after sending a
request using the getRedirectionsCount() method.
Adding Cookies and Using Cookie Persistence
Zend_Http_Client provides an easy interface for adding cookies
to your request, so that no direct header modification is
required. This is done using the setCookie() method. This method
can be used in several ways:
Setting Cookies Using setCookie()
setCookie('flavor', 'chocolate chips');
// By directly providing a raw cookie string (name=value)
// Note that the value must be already URL encoded
$client->setCookie('flavor=chocolate%20chips');
// By providing a Zend_Http_Cookie object
$cookie = Zend_Http_Cookie::fromString('flavor=chocolate%20chips');
$client->setCookie($cookie);
]]>
For more information about Zend_Http_Cookie objects, see
.
Zend_Http_Client also provides the means for cookie stickiness -
that is having the client internally store all sent and received
cookies, and resend them automatically on subsequent requests. This
is useful, for example when you need to log in to a remote site
first and receive and authentication or session ID cookie before
sending further requests.
Enabling Cookie Stickiness
setCookieJar();
// First request: log in and start a session
$client->setUri('http://example.com/login.php');
$client->setParameterPost('user', 'h4x0r');
$client->setParameterPost('password', '1337');
$client->request('POST');
// The Cookie Jar automatically stores the cookies set
// in the response, like a session ID cookie.
// Now we can send our next request - the stored cookies
// will be automatically sent.
$client->setUri('http://example.com/read_member_news.php');
$client->request('GET');
]]>
For more information about the Zend_Http_CookieJar class, see
.
File Uploads
You can upload files through HTTP using the setFileUpload method.
This method takes a file name as the first parameter, a form name
as the second parameter, and data as a third optional parameter.
If the third data parameter is null, the first file name parameter
is considered to be a real file on disk, and Zend_Http_Client will
try to read this file and upload it. If the data parameter is not
null, the first file name parameter will be sent as the file name,
but no actual file needs to exist on the disk.
The second form name parameter is always required, and is equivalent
to the "name" attribute of an >input< tag, if the file was to
be uploaded through an HTML form.
A fourth optional parameter provides the file's content-type. If
not specified, and Zend_Http_Client reads the file from the disk,
the mime_content_type function will be used to guess the file's
content type, if it is available. In any case, the default MIME
type will be application/octet-stream.
Using setFileUpload to Upload Files
setFileUpload('some_text.txt', 'upload', $text, 'text/plain');
// Uploading an existing file
$client->setFileUpload('/tmp/Backup.tar.gz', 'bufile');
// Send the files
$client->request('POST');
]]>
In the first example, the $text variable is uploaded and will be
available as $_FILES['upload'] on the server side. In the second
example, the existing file /tmp/Backup.tar.gz is uploaded to the
server and will be available as $_FILES['bufile']. The content type
will be guesses automatically if possible - and if not, the content
type will be set to 'application/octet-stream'.
Uploading files
When uploading files, the HTTP request content-type is
automatically set to multipart/form-data. Keep in mind that
you must send a POST or PUT request in order to upload files.
Most servers will ignore the requests body on other request
methods.
Sending Raw POST Data
You can use a Zend_Http_Client to send raw POST data using the
setRawData() method. This method takes two parameters: the first
is the data to send in the request body. The second optional
parameter is the content-type of the data. While this parameter is
optional, you should usually set it before sending the request -
either using setRawData(), or with another method: setEncType().
Sending Raw POST Data
' .
' Islands in the Stream' .
' Ernest Hemingway' .
' 1970' .
'';
$client->setRawData($xml, 'text/xml')->request('POST');
// Another way to do the same thing:
$client->setRawData($xml)->setEncType('text/xml')->request('POST');
]]>
The data should be available on the server side through PHP's
$HTTP_RAW_POST_DATA variable or through the php://input stream.
Using raw POST data
Setting raw POST data for a request will override any POST
parameters or file uploads. You should not try to use both on
the same request. Keep in mind that most servers will ignore
the request body unless you send a POST request.
HTTP Authentication
Currently, Zend_Http_Client only supports basic HTTP authentication.
This feature is utilized using the setAuth() method. The method
takes 3 parameters: The user name, the password and an optional
authentication type parameter. As mentioned, currently only basic
authentication is supported (digest authentication support is
planned).
Setting HTTP Authentication User and Password
setAuth('shahar', 'myPassword!', Zend_Http_Client::AUTH_BASIC);
// Since basic auth is default, you can just do this:
$client->setAuth('shahar', 'myPassword!');
]]>
Sending Multiple Requests With the Same Client
Zend_Http_Client was also designed specifically to handle several
consecutive requests with the same object. This is useful in cases
where a script requires data to be fetched from several places, or
when accessing a specific HTTP resource requires logging in and
obtaining a session cookie, for example.
When performing several requests to the same host, it is highly
recommended to enable the 'keepalive' configuration flag. This way,
if the server supports keep-alive connections, the connection to the
server will only be closed once all requests are done and the Client
object is destroyed. This prevents the overhead of opening and
closing TCP connections to the server.
When you perform several requests with the same client, but want
to make sure all the request-specific parameters are cleared, you
should use the resetParameters() method. This ensures that GET and
POST parameters, request body and request-specific headers are
reset and are not reused in the next request.
Resetting parameters
Note that non-request specific headers are not reset when the
resetParameters method is used. As a matter of fact, only the
'Content-length' and 'Content-type' headers are reset. This
allows you to set-and-forget headers like 'Accept-language' and
'Accept-encoding'
Another feature designed specifically for consecutive requests is
the Cookie Jar object. Cookie Jars allow you to automatically save
cookies set by the server in the first request, and send them on
consecutive requests transparently. This allows, for example, going
through an authentication request before sending the actual data
fetching request.
If your application requires one authentication request per user,
and consecutive requests might be performed in more than one script
in your application, it might be a good idea to store the Cookie Jar
object in the user's session. This way, you will only need to
authenticate the user once every session.
Performing consecutive requests with one client
true
));
// Do we have the cookies stored in our session?
if (isset($_SESSION['cookiejar']) &&
$_SESSION['cookiejar'] instanceof Zend_Http_CookieJar)) {
$client->setCookieJar($_SESSION['cookiejar']);
} else {
// If we don't, authenticate and store cookies
$client->setCookieJar();
$client->setUri('http://www.example.com/login.php');
$client->setParameterPost(array(
'user' => 'shahar',
'pass' => 'somesecret'
));
$client->request(Zend_Http_Client::POST);
// Now, clear parameters and set the URI to the original one
// (note that the cookies that were set by the server are now
// stored in the jar)
$client->resetParameters();
$client->setUri('http://www.example.com/fetchdata.php');
}
$response = $client->request(Zend_Http_Client::GET);
// Store cookies in session, for next page
$_SESSION['cookiejar'] = $client->getCookieJar();
]]>