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:
#### 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**):
@@ -163,6 +174,14 @@ 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
@@ -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/).
[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-image]: https://badge.fury.io/ph/mashape%2Funirest-php.svg

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

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

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