Skip to content

[PHP] Make API client more pluggable #778

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 23, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions modules/swagger-codegen/src/main/resources/php/APIClient.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,36 @@ class APIClient {
}

/**
* @param integer $seconds Number of seconds before timing out [set to 0 for no timeout]
* get the user agent of the api client
*
* @return string user agent
*/
public function getUserAgent($user_agent) {
return $this->user_agent;
}

/**
* set the HTTP timeout value
*
* @param integer $seconds Number of seconds before timing out [set to 0 for no timeout]
*/
public function setTimeout($seconds) {
if (!is_numeric($seconds))
throw new \InvalidArgumentException('Timeout variable must be numeric.');
if (!is_numeric($seconds) || $seconds < 0)
throw new \InvalidArgumentException('Timeout value must be numeric and a non-negative number.');

$this->curl_timeout = $seconds;
}

/**
* get the HTTP timeout value
*
* @return string HTTP timeout value
*/
public function getTimeout() {
return $this->curl_timeout;
}


/**
* Get API key (with prefix if set)
* @param string key name
Expand Down
27 changes: 26 additions & 1 deletion modules/swagger-codegen/src/main/resources/php/api.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,32 @@ namespace {{invokerPackage}};
{{#operations}}
class {{classname}} {

function __construct($apiClient) {
function __construct($apiClient = null) {
if (null === $apiClient) {
if (Configuration::$apiClient === null) {
Configuration::$apiClient = new APIClient(); // create a new API client if not present
$this->apiClient = Configuration::$apiClient;
}
else
$this->apiClient = Configuration::$apiClient; // use the default one
} else {
$this->apiClient = $apiClient; // use the one provided by the user
}
}

private $apiClient; // instance of the APIClient

/**
* get the API client
*/
public function getApiClient() {
return $this->apiClient;
}

/**
* set the API client
*/
public function setApiClient($apiClient) {
$this->apiClient = $apiClient;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ class Configuration {
public static $username = '';
public static $password = '';

// an instance of APIClient
public static $apiClient;

/*
* manually initalize API client
*/
public static function init() {
if (self::$apiClient === null)
self::$apiClient = new APIClient();
}

}

27 changes: 24 additions & 3 deletions samples/client/petstore/php/SwaggerClient-php/lib/APIClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,36 @@ public function setUserAgent($user_agent) {
}

/**
* @param integer $seconds Number of seconds before timing out [set to 0 for no timeout]
* get the user agent of the api client
*
* @return string user agent
*/
public function getUserAgent($user_agent) {
return $this->user_agent;
}

/**
* set the HTTP timeout value
*
* @param integer $seconds Number of seconds before timing out [set to 0 for no timeout]
*/
public function setTimeout($seconds) {
if (!is_numeric($seconds))
throw new \InvalidArgumentException('Timeout variable must be numeric.');
if (!is_numeric($seconds) || $seconds < 0)
throw new \InvalidArgumentException('Timeout value must be numeric and a non-negative number.');

$this->curl_timeout = $seconds;
}

/**
* get the HTTP timeout value
*
* @return string HTTP timeout value
*/
public function getTimeout() {
return $this->curl_timeout;
}


/**
* Get API key (with prefix if set)
* @param string key name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,16 @@ class Configuration {
public static $username = '';
public static $password = '';

// an instance of APIClient
public static $apiClient;

/*
* manually initalize API client
*/
public static function init() {
if (self::$apiClient === null)
self::$apiClient = new APIClient();
}

}

27 changes: 26 additions & 1 deletion samples/client/petstore/php/SwaggerClient-php/lib/PetApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,32 @@

class PetApi {

function __construct($apiClient) {
function __construct($apiClient = null) {
if (null === $apiClient) {
if (Configuration::$apiClient === null) {
Configuration::$apiClient = new APIClient(); // create a new API client if not present
$this->apiClient = Configuration::$apiClient;
}
else
$this->apiClient = Configuration::$apiClient; // use the default one
} else {
$this->apiClient = $apiClient; // use the one provided by the user
}
}

private $apiClient; // instance of the APIClient

/**
* get the API client
*/
public function getApiClient() {
return $this->apiClient;
}

/**
* set the API client
*/
public function setApiClient($apiClient) {
$this->apiClient = $apiClient;
}

Expand Down
27 changes: 26 additions & 1 deletion samples/client/petstore/php/SwaggerClient-php/lib/StoreApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,32 @@

class StoreApi {

function __construct($apiClient) {
function __construct($apiClient = null) {
if (null === $apiClient) {
if (Configuration::$apiClient === null) {
Configuration::$apiClient = new APIClient(); // create a new API client if not present
$this->apiClient = Configuration::$apiClient;
}
else
$this->apiClient = Configuration::$apiClient; // use the default one
} else {
$this->apiClient = $apiClient; // use the one provided by the user
}
}

private $apiClient; // instance of the APIClient

/**
* get the API client
*/
public function getApiClient() {
return $this->apiClient;
}

/**
* set the API client
*/
public function setApiClient($apiClient) {
$this->apiClient = $apiClient;
}

Expand Down
27 changes: 26 additions & 1 deletion samples/client/petstore/php/SwaggerClient-php/lib/UserApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,32 @@

class UserApi {

function __construct($apiClient) {
function __construct($apiClient = null) {
if (null === $apiClient) {
if (Configuration::$apiClient === null) {
Configuration::$apiClient = new APIClient(); // create a new API client if not present
$this->apiClient = Configuration::$apiClient;
}
else
$this->apiClient = Configuration::$apiClient; // use the default one
} else {
$this->apiClient = $apiClient; // use the one provided by the user
}
}

private $apiClient; // instance of the APIClient

/**
* get the API client
*/
public function getApiClient() {
return $this->apiClient;
}

/**
* set the API client
*/
public function setApiClient($apiClient) {
$this->apiClient = $apiClient;
}

Expand Down
37 changes: 30 additions & 7 deletions samples/client/petstore/php/SwaggerClient-php/tests/PetApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ class PetApiTest extends \PHPUnit_Framework_TestCase

// add a new pet (id 10005) to ensure the pet object is available for all the tests
public static function setUpBeforeClass() {
// initialize the API client
$api_client = new SwaggerClient\APIClient('http://petstore.swagger.io/v2');
// skip initializing the API client as it should be automatic
//$api_client = new SwaggerClient\APIClient('http://petstore.swagger.io/v2');
// new pet
$new_pet_id = 10005;
$new_pet = new SwaggerClient\models\Pet;
Expand All @@ -26,34 +26,57 @@ public static function setUpBeforeClass() {
$new_pet->tags = [$tag];
$new_pet->category = $category;

$pet_api = new SwaggerClient\PetAPI($api_client);
$pet_api = new SwaggerClient\PetAPI();
// add a new pet (model)
$add_response = $pet_api->addPet($new_pet);
}

// test static functions defined in APIClient
public function testAPIClient()
{
# test selectHeaderAccept
// test selectHeaderAccept
$this->assertSame('application/json', SwaggerClient\APIClient::selectHeaderAccept(array('application/xml','application/json')));
$this->assertSame(NULL, SwaggerClient\APIClient::selectHeaderAccept(array()));
$this->assertSame('application/yaml,application/xml', SwaggerClient\APIClient::selectHeaderAccept(array('application/yaml','application/xml')));

# test selectHeaderContentType
// test selectHeaderContentType
$this->assertSame('application/json', SwaggerClient\APIClient::selectHeaderContentType(array('application/xml','application/json')));
$this->assertSame('application/json', SwaggerClient\APIClient::selectHeaderContentType(array()));
$this->assertSame('application/yaml,application/xml', SwaggerClient\APIClient::selectHeaderContentType(array('application/yaml','application/xml')));

# test addDefaultHeader and getDefaultHeader
// test addDefaultHeader and getDefaultHeader
SwaggerClient\APIClient::addDefaultHeader('test1', 'value1');
SwaggerClient\APIClient::addDefaultHeader('test2', 200);
$this->assertSame('value1', SwaggerClient\APIClient::getDefaultHeader()['test1']);
$this->assertSame(200, SwaggerClient\APIClient::getDefaultHeader()['test2']);

# test deleteDefaultHeader
// test deleteDefaultHeader
SwaggerClient\APIClient::deleteDefaultHeader('test2');
$this->assertFalse(isset(SwaggerClient\APIClient::getDefaultHeader()['test2']));

$pet_api = new SwaggerClient\PetAPI();
$pet_api2 = new SwaggerClient\PetAPI();
$apiClient3 = new SwaggerClient\APIClient();
$apiClient3->setUserAgent = 'api client 3';
$apiClient4 = new SwaggerClient\APIClient();
$apiClient4->setUserAgent = 'api client 4';
$pet_api3 = new SwaggerClient\PetAPI($apiClient3);

// same default api client
$this->assertSame($pet_api->getApiClient(), $pet_api2->getApiClient());
// confirm using the default api client in the Configuration
$this->assertSame($pet_api->getApiClient(), SwaggerClient\Configuration::$apiClient);
// 2 different api clients are not the same
$this->assertNotEquals($apiClient3, $apiClient4);
// customized pet api not using the default (configuration) api client
$this->assertNotEquals($pet_api3->getApiClient(), SwaggerClient\Configuration::$apiClient);
// customied pet api not using the old pet api's api client
$this->assertNotEquals($pet_api2->getApiClient(), $pet_api3->getApiClient());

// both pet api and pet api2 share the same api client and confirm using timeout value
$pet_api->getApiClient()->setTimeout(999);
$this->assertSame(999, $pet_api2->getApiClient()->getTimeout());

}

// test getPetById with a Pet object (id 10005)
Expand Down
7 changes: 4 additions & 3 deletions samples/client/petstore/php/test.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
require_once('SwaggerClient-php/SwaggerClient.php');

// initialize the API client
$api_client = new SwaggerClient\APIClient('http://petstore.swagger.io/v2');
$api_client->addDefaultHeader("test1", "value1");
//$api_client = new SwaggerClient\APIClient('http://petstore.swagger.io/v2');
//$api_client->addDefaultHeader("test1", "value1");

$petId = 10005; // ID of pet that needs to be fetched
try {
$pet_api = new SwaggerClient\PetAPI($api_client);
//$pet_api = new SwaggerClient\PetAPI($api_client);
$pet_api = new SwaggerClient\PetAPI();
// return Pet (model)
$response = $pet_api->getPetById($petId);
var_dump($response);
Expand Down