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
Add this to the require block in your composer.json
.
{
"require": {
"asika/http": "~1.0"
}
}
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();
$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');
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
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));
$http = new HttpClient;
$dest = '/path/to/local/file.zip';
$response = $http->download('http://example.com/file.zip', $dest);
if ($response->getStatusCode() != 200)
{
// Error
}
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
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
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 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
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
);