Home

Awesome

The PSR7 Http Implementation Analytics

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

This package provides PSR7 standard Http message objects, Uri objects, Stream objects and Client request object. (PHP 5.3 Compatible)

Some parts of this package based on phly/http and joomla/http

Project deprecated, please see windwalker/http

Installation via Composer

Add this to the require block in your composer.json.

{
    "require": {
        "asika/http": "~1.0"
    }
}

Make A Request

HttpClient is a simple class to make restful request.

use Asika\Http\HttpClient;

$http = new HttpClient;

$response = $http->get('http://example.com/?foo=bar');

// This is PSR7 ResponseInterface
(string) $response->getBody();

Other Methods

$http = new HttpClient;

// The post data can be query string or array
$response = $http->post('http://example.com/?foo=bar', array('post_data' => 'data'));
$response = $http->put('http://example.com/?foo=bar', array('post_data' => 'data'));
$response = $http->patch('http://example.com/?foo=bar', array('post_data' => 'data'));
$response = $http->delete('http://example.com/?foo=bar', array('post_data' => 'data'));

$response = $http->head('http://example.com/?foo=bar');
$response = $http->trace('http://example.com/?foo=bar');
$response = $http->options('http://example.com/?foo=bar');

// With headers
$response = $http->get('http://example.com/', null, array('X-Foo' => 'Bar'));

// Use request()
$response = $http->request('POST', 'http://example.com/?foo=bar', 'this=is&post=data');

Use Psr RequestInterface to Make Request

Psr7 Request is a immutable object, you have to get the return object every operation.

use Asika\Http\Request;

$request = new Request;

// Note: You have to get the return value.
// Every change will return new object.
$request = $request->withRequestTarget('http://example.com/flower/sakura')
    ->withMethod('POST')
    ->withAddedHeader('Authorization', 'Bearer ' . $token)
    ->withAddedHeader('Content-Type', 'application/text');

// OR
$request = new Request(
    'http://example.com/flower/sakura',
    'POST',
    'php://memory',
    array(
        'Authorization' => 'Bearer ' . $token,
        'Content-Type'  => 'application/json',
    )
);

// This is a POST request so we write post data to body
$request->getBody()->write('this=is&post=data');

$http = new HttpClient;

// Send request
$response = $http->send($request);

Use Uri and Json output.

use Asika\Http\Request;
use Asika\Http\Uri\PsrUri;

$request = (new Request)
    ->withUri(new PsrUri('http://example.com'))
    ->withMethod('POST')
    ->withAddedHeader('Authorization', 'Bearer ' . $token)
    ->withAddedHeader('Content-Type', 'application/json') // Use JSON
    
    // Note: Request will ignore path and query in Uri
    // So we have to set RequestTarget here
    ->withRequestTarget('/path/of/uri?flower=sakura');

// If you want to set a non-origin-form request target, set the
// request-target explicitly:
$request = $request->withRequestTarget((string) $uri);       // absolute-form
$request = $request->withRequestTarget($uri->getAuthority(); // authority-form
$request = $request->withRequestTarget('*');                 // asterisk-form

// This is JSON request so we encode data here
$request->getBody()->write(json_encode($data));
$response = $http->send($request);

$response->getStatusCode(); // 200 is OK

Custom Transports and Options

Now support Curl and Steam 2 transports.

use Asika\Http\Transport\CurlTransport;

$options = array(
    'certpath' => '/custom/cert.pem'
);

$transport = new CurlTransport($options);

// Set transport when client new
$http = new HttpClient(array(), $transport);

Set custom CURL options:

$options = array(
    'options' => array(
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => true
    )
);

$httpOptions = array(
    'headers' => array(
        'X-Foo' => 'Bar'
    )
);

$http = new HttpClient($httpOptions, new CurlTransport($options));

Download Remote File

$http = new HttpClient;

$dest = '/path/to/local/file.zip';

$response = $http->download('http://example.com/file.zip', $dest);

if ($response->getStatusCode() != 200)
{
    // Error
}

Response Interface

Response object holds a Stream object to store returned string.

// The return value is: 'FOO BAR'
$body = $response->getBody();

// Simply to string
(string) $body; // FOO BAR

$body->seek(2);
$body->getContents(); // O BAR

$body->rewind();
$body->read(5); // FOO B

$body->getSize(); // 7

Uri

Uri is a simple Uri object to modify URL but not Psr UriInterface.

The methods provided in the Uri class allow you to manipulate all aspects of a uri. For example, suppose you wanted to set a new uri, add in a port, and then also post a username and password to authenticate a .htaccess security file. You could use the following syntax:

// new uri object
$uri = new Asika\Http\Uri\Uri;

$uri->setHost('http://localhost');
$uri->setPort('8888');
$uri->setUser('myUser');
$uri->setPass('myPass');

echo $uri->__toString();

This will output:

myUser:myPass@http://localhost:8888

If you wanted to add a specific filepath after the host you could use the setPath() method:

// set path
$uri->setPath('path/to/file.php');

Which will output

myUser:myPass@http://localhost:8888path/to/file.php

Adding a URL query:

// url query
$uri->setQuery('foo=bar');

Output:

myUser:myPass@http://localhost:8888path/to/file.php?foo=bar

PsrUri

PsrUri is a Uri object implemented the Psr UriInterface.

This object is also immutable, so we must get return value as new object every change.

$uri = (new PsrUri('http://example.com'))
    ->withScheme('https')
    ->withUserInfo('user', 'pass')
    ->withPath('/path/to/target')
    ->withQuery('flower=sakura')
    ->withFragment('#hash');
    
(string) $uri; // https://user:pass@example.com/path/to/target?flower=sakura#fragment

Stream

Stream is a powerful stream wrapper.

Read write data to memory:

$stream = new Stream('php://memory', 'wb+');

$stream->write('Foo Bar');

$stream->rewind(); // Back to begin

// Now we take something we wrote into memory

$stream->__toString(); // get: Foo Bar

// OR

$stream->rewind();
$stream->getContents(); // get: Foo Bar

Read data from php://input

$stream = new PhpInputSteam;

$data = $stream->__toString(); // foo=bar

$query = \Asika\Http\Uri\UriHelper::parseQuery($data); // array('foo' => 'bar')

Read file:

$stream = new Stream('/path/to/file.txt', 'r+');

$stream->__toString(); // Read

$steam->seek($stream->getSize());
$steam->write('new string'); // Write

Quick copy stream.

// Remote source
$src = new Stream('http://example/test.txt');

// Local store
$dest = new Stream('/path/to/local/test.txt');

// Do copy
\Asika\Http\Helper\StreamHelper::copy($src, $dest);

// Get Data
$dest->rewind();
$data = $dest->getContents();

See: Psr7 StreamInterface / API

Other Http Message Objects

ServerRequest

A Request object to store server data, like: $_SERVER, $_COOKIE, $_REQUEST etc.

UploadedFile

An object to store uploaded files, see: Uploaded files interface

$files = array();

foreach ($_FILE as $name => $file)
{
    $files[$name] = new UploadedFile($file['tmp_name'], $file['size'], $file['error'], $file['name'], $file['type']);
}

$request = new ServerRequest(
  $_SERVER,
  $_GET,
  $_POST,
  $_COOKIE,
  $files
);

More About Psr 7

PSR7 HTTP message interfaces / HTTP Message Meta Document