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 - 5.6
- hhvm - hhvm
before_script:
- composer selfupdate
- composer install
after_script: 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: notifications:
webhooks: webhooks:
@@ -16,3 +21,8 @@ notifications:
on_success: always on_success: always
on_failure: always on_failure: always
on_start: false 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) * Customizable default headers for every request (DRY)
* Automatic JSON parsing into a native object for JSON responses * Automatic JSON parsing into a native object for JSON responses
## Requirements
- [cURL](http://php.net/manual/en/book.curl.php)
## Installation ## Installation
### Using [Composer](https://getcomposer.org) ### 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: To install unirest-php with Composer, just add the following to your `composer.json` file:
```json ```json
// composer.json
{ {
"require-dev": { "require-dev": {
"mashape/unirest-php": "2.*" "mashape/unirest-php": "2.*"
@@ -117,11 +120,11 @@ $response = Unirest\Request::get("http://httpbin.org/get", null, null, "username
### Request Object ### Request Object
```php ```php
Unirest\Request::get($url, $headers = array(), $parameters = 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::post($url, $headers = array(), $body = null, $username = null, $password = null)
Unirest\Request::put($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::patch($url, $headers = array(), $body = null, $username = null, $password = null)
Unirest\Request::delete($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. - `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 - `username` - Basic Authentication username
- `password` - Basic Authentication password - `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 ### 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. 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: 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 #### Timeout
You can set a custom timeout value (in **seconds**): You can set a custom timeout value (in **seconds**):
@@ -160,6 +182,15 @@ Unirest\Request::defaultHeader("Header1", "Value1");
Unirest\Request::defaultHeader("Header2", "Value2"); 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: You can clear the default headers anytime with:
```php ```php
@@ -178,12 +209,12 @@ By default is `true`.
## License ## 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-url]: https://gitter.im/Mashape/unirest-php
[gitter-image]: https://badges.gitter.im/Mashape.png [gitter-image]: https://badges.gitter.im/Join%20Chat.svg
[composer-url]: http://badge.fury.io/ph/mashape%2Funirest-php [composer-url]: http://badge.fury.io/ph/mashape%2Funirest-php
[composer-image]: https://badge.fury.io/ph/mashape%2Funirest-php.svg [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-url]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d
[dependency-image]: https://www.versioneye.com/user/projects/54b702db050646ca5c00019d/badge.svg?style=flat [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)", "author": "Mashape <opensource@mashape.com> (https://www.mashape.com)",
"require": { "require": {
"php": ">=5.4.0", "php": ">=5.4.0",
"ext-curl": "0.0.0.*", "ext-curl": "*",
"ext-json": "~1.3" "ext-json": "*"
}, },
"require-dev": { "require-dev": {
"ext-xdebug": "~2.2",
"phpunit/phpunit": "~4.4", "phpunit/phpunit": "~4.4",
"codeclimate/php-test-reporter": "0.1.*" "codeclimate/php-test-reporter": "0.1.*"
}, },

View File

@@ -7,36 +7,66 @@ use Unirest\Response;
class Request class Request
{ {
private static $jsonOpts = array();
private static $verifyPeer = true; private static $verifyPeer = true;
private static $socketTimeout = null; private static $socketTimeout = null;
private static $defaultHeaders = array(); 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 * Verify SSL peer
*
* @param bool $enabled enable SSL verification, by default is true * @param bool $enabled enable SSL verification, by default is true
*/ */
public static function verifyPeer($enabled) public static function verifyPeer($enabled)
{ {
self::$verifyPeer = $enabled; return self::$verifyPeer = $enabled;
} }
/** /**
* Set a timeout * Set a timeout
*
* @param integer $seconds timeout value in seconds * @param integer $seconds timeout value in seconds
*/ */
public static function timeout($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 * Set a new default header to send on every request
*
* @param string $name header name * @param string $name header name
* @param string $value header value * @param string $value header value
*/ */
public static function defaultHeader($name, $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() public static function clearDefaultHeaders()
{ {
self::$defaultHeaders = array(); return self::$defaultHeaders = array();
} }
/** /**
* Send a GET request to a URL * Send a GET request to a URL
*
* @param string $url URL to send the GET request to * @param string $url URL to send the GET request to
* @param array $headers additional headers to send * @param array $headers additional headers to send
* @param mixed $parameters parameters to send in the querystring * @param mixed $parameters parameters to send in the querystring
@@ -213,31 +244,11 @@ class Request
* @throws Exception if a cURL error occurs * @throws Exception if a cURL error occurs
* @return Unirest\Response * @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(); $ch = curl_init();
if ($method != Method::GET) { if ($method !== Method::GET) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if (is_array($body) || $body instanceof \Traversable) { if (is_array($body) || $body instanceof \Traversable) {
@@ -259,12 +270,12 @@ class Request
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); 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_HEADER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, self::$verifyPeer); 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. 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); curl_setopt($ch, CURLOPT_TIMEOUT, self::$socketTimeout);
} }
@@ -286,7 +297,28 @@ class Request
$body = substr($response, $header_size); $body = substr($response, $header_size);
$httpCode = $curl_info['http_code']; $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) private static function getArrayFromQuerystring($query)
@@ -315,11 +347,11 @@ class Request
$path = (isset($url_parsed['path']) ? $url_parsed['path'] : null); $path = (isset($url_parsed['path']) ? $url_parsed['path'] : null);
$query = (isset($url_parsed['query']) ? $url_parsed['query'] : null); $query = (isset($url_parsed['query']) ? $url_parsed['query'] : null);
if ($query != null) { if ($query !== null) {
$query = '?' . http_build_query(self::getArrayFromQuerystring($query)); $query = '?' . http_build_query(self::getArrayFromQuerystring($query));
} }
if ($port && $port[0] != ':') { if ($port && $port[0] !== ':') {
$port = ':' . $port; $port = ':' . $port;
} }
@@ -327,7 +359,7 @@ class Request
return $result; return $result;
} }
private static function getHeader($key, $val) private static function getHeaderString($key, $val)
{ {
$key = trim(strtolower($key)); $key = trim(strtolower($key));
return $key . ': ' . $val; return $key . ': ' . $val;

View File

@@ -13,14 +13,19 @@ class Response
* @param int $code response code of the cURL request * @param int $code response code of the cURL request
* @param string $raw_body the raw body of the cURL response * @param string $raw_body the raw body of the cURL response
* @param string $headers raw header string from 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->code = $code;
$this->headers = $this->parseHeaders($headers); $this->headers = $this->parseHeaders($headers);
$this->raw_body = $raw_body; $this->raw_body = $raw_body;
$this->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) { if (json_last_error() === JSON_ERROR_NONE) {
$this->body = $json; $this->body = $json;

View File

@@ -171,7 +171,10 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$args = $response->body->args; $args = $response->body->args;
$this->assertEquals('Mark=Hello', $args->name); $this->assertEquals('Mark=Hello', $args->name);
}
public function testGetWithEqualSignAlt()
{
$response = Unirest\Request::get('http://httpbin.org/get', array( $response = Unirest\Request::get('http://httpbin.org/get', array(
'Accept' => 'application/json' 'Accept' => 'application/json'
), array( ), array(
@@ -184,6 +187,17 @@ class UnirestRequestTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('Mark=Hello=John', $args->name); $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() public function testGetArray()
{ {
$response = Unirest\Request::get('http://httpbin.org/get', array(), array( $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);
}
}