JSON Decoding options

- users can now specify all the json_decode params to be used
- additional method added: `Unirest\Request::defaultHeaders`
This commit is contained in:
Ahmad Nassri
2015-01-15 01:22:23 -05:00
parent 3bb82974cc
commit ba25e0304a
4 changed files with 91 additions and 8 deletions

View File

@@ -146,6 +146,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**):
@@ -163,6 +174,14 @@ 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
@@ -186,7 +205,7 @@ Licensed under [the MIT license](https://github.com/Mashape/unirest-php/blob/mas
Created with love by [Mashape](https://www.mashape.com/). Created with love by [Mashape](https://www.mashape.com/).
[gitter-url]: https://gitter.im/Mashape/unirest-php [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

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
@@ -286,7 +317,7 @@ 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);
} }
private static function getArrayFromQuerystring($query) private static function getArrayFromQuerystring($query)

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

@@ -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);
}
}