14 Commits
2.0.0 ... 2.1.0

Author SHA1 Message Date
Ahmad Nassri
90be29ced4 typo 2015-01-15 01:47:58 -05:00
Ahmad Nassri
8dcb11e0a6 updating README with new info 2015-01-15 01:46:21 -05:00
Ahmad Nassri
3591292c3e eliminating code smells and converting Unirest\Request::send into a public method 2015-01-15 01:42:43 -05:00
Ahmad Nassri
3ec25a5d17 adjusting requirements 2015-01-15 01:32:53 -05:00
Ahmad Nassri
fbe66400fc allow hhvm to fail 2015-01-15 01:30:10 -05:00
Ahmad Nassri
f68939375b closing code 2015-01-15 01:25:30 -05:00
Ahmad Nassri
ba25e0304a JSON Decoding options
- users can now specify all the json_decode params to be used
- additional method added: `Unirest\Request::defaultHeaders`
2015-01-15 01:22:23 -05:00
Ahmad Nassri
3bb82974cc codeclimate seems to have a self-signed ssl, which causes errors in travis 2015-01-15 00:33:18 -05:00
Ahmad Nassri
3eb8536d3d new test to validate #58 2015-01-15 00:30:47 -05:00
Ahmad Nassri
4762858017 fixing ext-json dependency for older php 2015-01-15 00:16:40 -05:00
Ahmad Nassri
7404fca828 minor update to README & Travis fix 2015-01-15 00:12:52 -05:00
Ahmad Nassri
1dfcade505 Update README.md 2015-01-14 21:47:33 -05:00
Ahmad Nassri
976247358b Update README.md 2015-01-14 21:45:22 -05:00
Ahmad Nassri
a58c5592d5 Update README.md 2015-01-14 21:45:01 -05:00
7 changed files with 167 additions and 50 deletions

View File

@@ -6,8 +6,13 @@ php:
- 5.6
- hhvm
before_script:
- composer selfupdate
- composer install
after_script:
- vendor/bin/test-reporter
- vendor/bin/test-reporter --stdout > codeclimate.json
- "curl -X POST -d @codeclimate.json -H 'Content-Type: application/json' -H 'User-Agent: Code Climate (PHP Test Reporter v0.1.1)' https://codeclimate.com/test_reports"
notifications:
webhooks:
@@ -16,3 +21,8 @@ notifications:
on_success: always
on_failure: always
on_start: false
matrix:
fast_finish: true
allow_failures:
- php: hhvm

View File

@@ -18,6 +18,10 @@ Unirest is a set of lightweight HTTP libraries available in multiple languages,
* Customizable default headers for every request (DRY)
* Automatic JSON parsing into a native object for JSON responses
## Requirements
- [cURL](http://php.net/manual/en/book.curl.php)
## Installation
### Using [Composer](https://getcomposer.org)
@@ -25,7 +29,6 @@ Unirest is a set of lightweight HTTP libraries available in multiple languages,
To install unirest-php with Composer, just add the following to your `composer.json` file:
```json
// composer.json
{
"require-dev": {
"mashape/unirest-php": "2.*"
@@ -117,11 +120,11 @@ $response = Unirest\Request::get("http://httpbin.org/get", null, null, "username
### Request Object
```php
Unirest\Request::get($url, $headers = array(), $parameters = NULL, $username = NULL, $password = NULL)
Unirest\Request::post($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL)
Unirest\Request::put($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL)
Unirest\Request::patch($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL)
Unirest\Request::delete($url, $headers = array(), $body = NULL, $username = NULL, $password = NULL)
Unirest\Request::get($url, $headers = array(), $parameters = null, $username = null, $password = null)
Unirest\Request::post($url, $headers = array(), $body = null, $username = null, $password = null)
Unirest\Request::put($url, $headers = array(), $body = null, $username = null, $password = null)
Unirest\Request::patch($url, $headers = array(), $body = null, $username = null, $password = null)
Unirest\Request::delete($url, $headers = array(), $body = null, $username = null, $password = null)
```
- `url` - Endpoint, address, or uri to be acted upon and requested information from.
@@ -130,6 +133,14 @@ Unirest\Request::delete($url, $headers = array(), $body = NULL, $username = NULL
- `username` - Basic Authentication username
- `password` - Basic Authentication password
You can send a request with any [standard](http://www.iana.org/assignments/http-methods/http-methods.xhtml) or custom HTTP Method:
```php
Unirest\Request::send(Unirest\Method::LINK, $url, $headers = array(), $body);
Unirest\Request::send('CHECKOUT', $url, $headers = array(), $body);
```
### Response Object
Upon recieving a response Unirest returns the result in the form of an Object, this object should always have the same keys for each language regarding to the response details.
@@ -143,6 +154,17 @@ Upon recieving a response Unirest returns the result in the form of an Object, t
You can set some advanced configuration to tune Unirest-PHP:
#### Custom JSON Decode Flags
Unirest uses PHP's [JSON Extension](http://php.net/manual/en/book.json.php) for automatically decoding JSON responses.
sometime you may want to return associative arrays, limit the depth of recursion, or use any of the [customization flags](http://php.net/manual/en/json.constants.php#constant.json-hex-tag).
To do so, simply set the desired options using the `jsonOpts` request method:
```php
Unirest\Request::jsonOpts(true, 512, JSON_NUMERIC_CHECK & JSON_FORCE_OBJECT & JSON_UNESCAPED_SLASHES);
```
#### Timeout
You can set a custom timeout value (in **seconds**):
@@ -160,6 +182,15 @@ Unirest\Request::defaultHeader("Header1", "Value1");
Unirest\Request::defaultHeader("Header2", "Value2");
```
You can do set default headers in bulk:
```php
Unirest\Request::defaultHeaders(array(
"Header1" => "Value1",
"Header2" => "Value2"
));
```
You can clear the default headers anytime with:
```php
@@ -178,12 +209,12 @@ By default is `true`.
## License
Licensed under [the MIT license](LICENSE).
Licensed under [the MIT license](https://github.com/Mashape/unirest-php/blob/master/LICENSE).
Created with love by [![Mashape Logo][mashape-logo]](https://www.mashape.com/)
Created with love by [Mashape](https://www.mashape.com/).
[gitter-url]: https://gitter.im/Mashape
[gitter-image]: https://badges.gitter.im/Mashape.png
[gitter-url]: https://gitter.im/Mashape/unirest-php
[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
[composer-url]: http://badge.fury.io/ph/mashape%2Funirest-php
[composer-image]: https://badge.fury.io/ph/mashape%2Funirest-php.svg
@@ -199,5 +230,3 @@ Created with love by [![Mashape Logo][mashape-logo]](https://www.mashape.com/)
[dependency-url]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d
[dependency-image]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d/badge.svg?style=flat
[mashape-logo]: https://cloud.githubusercontent.com/assets/183195/5750736/c94e178c-9c26-11e4-91b2-84bcd5d33e28.png

View File

@@ -8,11 +8,10 @@
"author": "Mashape <opensource@mashape.com> (https://www.mashape.com)",
"require": {
"php": ">=5.4.0",
"ext-curl": "0.0.0.*",
"ext-json": "~1.3"
"ext-curl": "*",
"ext-json": "*"
},
"require-dev": {
"ext-xdebug": "~2.2",
"phpunit/phpunit": "~4.4",
"codeclimate/php-test-reporter": "0.1.*"
},

View File

@@ -7,36 +7,66 @@ use Unirest\Response;
class Request
{
private static $jsonOpts = array();
private static $verifyPeer = true;
private static $socketTimeout = null;
private static $defaultHeaders = array();
/**
* Set JSON decode mode
*
* @param bool $assoc When TRUE, returned objects will be converted into associative arrays.
* @param bool $depth User specified recursion depth.
* @param bool $options Bitmask of JSON decode options. Currently only JSON_BIGINT_AS_STRING is supported (default is to cast large integers as floats)
*/
public static function jsonOpts($assoc = false, $depth = 512, $options = 0)
{
return self::$jsonOpts = array($assoc, $depth, $options);
}
/**
* Verify SSL peer
*
* @param bool $enabled enable SSL verification, by default is true
*/
public static function verifyPeer($enabled)
{
self::$verifyPeer = $enabled;
return self::$verifyPeer = $enabled;
}
/**
* Set a timeout
*
* @param integer $seconds timeout value in seconds
*/
public static function timeout($seconds)
{
self::$socketTimeout = $seconds;
return self::$socketTimeout = $seconds;
}
/**
* Set default headers to send on every request
*
* @param array $headers headers array
*/
public static function defaultHeaders($headers)
{
foreach ($headers as $name => $value) {
self::$defaultHeaders[$name] = $value;
}
return $headers;
}
/**
* Set a new default header to send on every request
*
* @param string $name header name
* @param string $value header value
*/
public static function defaultHeader($name, $value)
{
self::$defaultHeaders[$name] = $value;
return self::$defaultHeaders[$name] = $value;
}
/**
@@ -44,11 +74,12 @@ class Request
*/
public static function clearDefaultHeaders()
{
self::$defaultHeaders = array();
return self::$defaultHeaders = array();
}
/**
* Send a GET request to a URL
*
* @param string $url URL to send the GET request to
* @param array $headers additional headers to send
* @param mixed $parameters parameters to send in the querystring
@@ -213,31 +244,11 @@ class Request
* @throws Exception if a cURL error occurs
* @return Unirest\Response
*/
private static function send($method, $url, $body = null, $headers = array(), $username = null, $password = null)
public static function send($method, $url, $body = null, $headers = array(), $username = null, $password = null)
{
if ($headers == null) {
$headers = array();
}
$lowercaseHeaders = array();
$finalHeaders = array_merge($headers, self::$defaultHeaders);
foreach ($finalHeaders as $key => $val) {
$lowercaseHeaders[] = self::getHeader($key, $val);
}
$lowerCaseFinalHeaders = array_change_key_case($finalHeaders);
if (!array_key_exists('user-agent', $lowerCaseFinalHeaders)) {
$lowercaseHeaders[] = 'user-agent: unirest-php/2.0';
}
if (!array_key_exists('expect', $lowerCaseFinalHeaders)) {
$lowercaseHeaders[] = 'expect:';
}
$ch = curl_init();
if ($method != Method::GET) {
if ($method !== Method::GET) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (is_array($body) || $body instanceof \Traversable) {
@@ -259,12 +270,12 @@ class Request
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $lowercaseHeaders);
curl_setopt($ch, CURLOPT_HTTPHEADER, self::getFormattedHeaders($headers));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, self::$verifyPeer);
curl_setopt($ch, CURLOPT_ENCODING, ''); // If an empty string, '', is set, a header containing all supported encoding types is sent.
if (self::$socketTimeout != null) {
if (self::$socketTimeout !== null) {
curl_setopt($ch, CURLOPT_TIMEOUT, self::$socketTimeout);
}
@@ -286,7 +297,28 @@ class Request
$body = substr($response, $header_size);
$httpCode = $curl_info['http_code'];
return new Response($httpCode, $body, $header);
return new Response($httpCode, $body, $header, self::$jsonOpts);
}
public static function getFormattedHeaders($headers)
{
$formattedHeaders = array();
$combinedHeaders = array_change_key_case(array_merge((array) $headers, self::$defaultHeaders));
foreach ($combinedHeaders as $key => $val) {
$formattedHeaders[] = self::getHeaderString($key, $val);
}
if (!array_key_exists('user-agent', $combinedHeaders)) {
$formattedHeaders[] = 'user-agent: unirest-php/2.0';
}
if (!array_key_exists('expect', $combinedHeaders)) {
$formattedHeaders[] = 'expect:';
}
return $formattedHeaders;
}
private static function getArrayFromQuerystring($query)
@@ -315,11 +347,11 @@ class Request
$path = (isset($url_parsed['path']) ? $url_parsed['path'] : null);
$query = (isset($url_parsed['query']) ? $url_parsed['query'] : null);
if ($query != null) {
if ($query !== null) {
$query = '?' . http_build_query(self::getArrayFromQuerystring($query));
}
if ($port && $port[0] != ':') {
if ($port && $port[0] !== ':') {
$port = ':' . $port;
}
@@ -327,7 +359,7 @@ class Request
return $result;
}
private static function getHeader($key, $val)
private static function getHeaderString($key, $val)
{
$key = trim(strtolower($key));
return $key . ': ' . $val;

View File

@@ -13,14 +13,19 @@ class Response
* @param int $code response code of the cURL request
* @param string $raw_body the raw body of the cURL response
* @param string $headers raw header string from cURL response
* @param array $json_args arguments to pass to json_decode function
*/
public function __construct($code, $raw_body, $headers)
public function __construct($code, $raw_body, $headers, $json_args = array())
{
$this->code = $code;
$this->headers = $this->parseHeaders($headers);
$this->raw_body = $raw_body;
$this->body = $raw_body;
$json = json_decode($raw_body);
// make sure raw_body is the first argument
array_unshift($json_args, $raw_body);
$json = call_user_func_array('json_decode', $json_args);
if (json_last_error() === JSON_ERROR_NONE) {
$this->body = $json;

View File

@@ -171,7 +171,10 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$args = $response->body->args;
$this->assertEquals('Mark=Hello', $args->name);
}
public function testGetWithEqualSignAlt()
{
$response = Unirest\Request::get('http://httpbin.org/get', array(
'Accept' => 'application/json'
), array(
@@ -184,6 +187,17 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('Mark=Hello=John', $args->name);
}
public function testGetWithComplexQuery()
{
$response = Unirest\Request::get('http://httpbin.org/get?query=[{"type":"/music/album","name":null,"artist":{"id":"/en/bob_dylan"},"limit":3}]&cursor');
$this->assertEquals(200, $response->code);
$args = $response->body->args;
$this->assertEquals('', $args->cursor);
$this->assertEquals('[{"type":"/music/album","name":null,"artist":{"id":"/en/bob_dylan"},"limit":3}]', $args->query);
}
public function testGetArray()
{
$response = Unirest\Request::get('http://httpbin.org/get', array(), array(

View File

@@ -0,0 +1,28 @@
<?php
class UnirestResponseTest extends \PHPUnit_Framework_TestCase
{
public function testJSONAssociativeArrays()
{
$opts = Unirest\Request::jsonOpts(true);
$response = new Unirest\Response(200, '{"a":1,"b":2,"c":3,"d":4,"e":5}', '', $opts);
$this->assertEquals($response->body['a'], 1);
}
public function testJSONAObjects()
{
$opts = Unirest\Request::jsonOpts(false);
$response = new Unirest\Response(200, '{"a":1,"b":2,"c":3,"d":4,"e":5}', '', $opts);
$this->assertEquals($response->body->a, 1);
}
public function testJSONOpts()
{
$opts = Unirest\Request::jsonOpts(false, 512, JSON_NUMERIC_CHECK);
$response = new Unirest\Response(200, '{"number": 1234567890}', '', $opts);
$this->assertSame($response->body->number, 1234567890);
}
}