You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
379 lines
11 KiB
379 lines
11 KiB
<?php |
|
|
|
/** |
|
* EBSCO Connector class |
|
* |
|
* PHP version 5 |
|
* |
|
*/ |
|
|
|
/** |
|
* EBSCOException class |
|
* Used when EBSCO API calls return an error message |
|
*/ |
|
class EBSCOException extends Exception { |
|
|
|
} |
|
|
|
/** |
|
* EBSCO Connector class |
|
*/ |
|
class EBSCOConnector { |
|
/** |
|
* Error codes defined by EDS API |
|
* |
|
* @global integer EDS_UNKNOWN_PARAMETER Unknown Parameter |
|
* @global integer EDS_INCORRECT_PARAMETER_FORMAT Incorrect Parameter Format |
|
* @global integer EDS_INCORRECT_PARAMETER_FORMAT Invalid Parameter Index |
|
* @global integer EDS_MISSING_PARAMETER Missing Parameter |
|
* @global integer EDS_AUTH_TOKEN_INVALID Auth Token Invalid |
|
* ... |
|
*/ |
|
|
|
const EDS_UNKNOWN_PARAMETER = 100; |
|
const EDS_INCORRECT_PARAMETER_FORMAT = 101; |
|
const EDS_INVALID_PARAMETER_INDEX = 102; |
|
const EDS_MISSING_PARAMETER = 103; |
|
const EDS_AUTH_TOKEN_INVALID = 104; |
|
const EDS_INCORRECT_ARGUMENTS_NUMBER = 105; |
|
const EDS_UNKNOWN_ERROR = 106; |
|
const EDS_AUTH_TOKEN_MISSING = 107; |
|
const EDS_SESSION_TOKEN_MISSING = 108; |
|
const EDS_SESSION_TOKEN_INVALID = 109; |
|
const EDS_INVALID_RECORD_FORMAT = 110; |
|
const EDS_UNKNOWN_ACTION = 111; |
|
const EDS_INVALID_ARGUMENT_VALUE = 112; |
|
const EDS_CREATE_SESSION_ERROR = 113; |
|
const EDS_REQUIRED_DATA_MISSING = 114; |
|
const EDS_TRANSACTION_LOGGING_ERROR = 115; |
|
const EDS_DUPLICATE_PARAMETER = 116; |
|
const EDS_UNABLE_TO_AUTHENTICATE = 117; |
|
const EDS_SEARCH_ERROR = 118; |
|
const EDS_INVALID_PAGE_SIZE = 119; |
|
const EDS_SESSION_SAVE_ERROR = 120; |
|
const EDS_SESSION_ENDING_ERROR = 121; |
|
const EDS_CACHING_RESULTSET_ERROR = 122; |
|
|
|
|
|
/** |
|
* HTTP status codes constants |
|
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html |
|
*/ |
|
const HTTP_OK = 200; |
|
const HTTP_BAD_REQUEST = 400; |
|
const HTTP_NOT_FOUND = 404; |
|
const HTTP_INTERNAL_SERVER_ERROR = 500; |
|
|
|
/** |
|
* The URL of the EBSCO API server |
|
* @global string |
|
*/ |
|
private $end_point; |
|
|
|
/** |
|
* The URL of the EBSCO API server |
|
* @global string |
|
*/ |
|
private $authentication_end_point; |
|
|
|
/** |
|
* The password used for API transactions |
|
* @global string |
|
*/ |
|
private $password; |
|
|
|
/** |
|
* The user id used for API transactions |
|
* @global string |
|
*/ |
|
private $userId; |
|
|
|
/** |
|
* The interface ID used for API transactions |
|
* @global string |
|
*/ |
|
private $interfaceId; |
|
|
|
/** |
|
* The customer ID used for API transactions |
|
* @global string |
|
*/ |
|
private $orgId; |
|
|
|
private $profiled; |
|
|
|
/** |
|
* Constructor |
|
* |
|
* Setup the EBSCO API credentials |
|
* |
|
* @param none |
|
* |
|
* @access public |
|
*/ |
|
public function __construct($config) { |
|
|
|
$this->end_point = $config['rest_url']; |
|
$this->authentication_end_point = $config['auth_url']; |
|
|
|
$this->userId = $config['user']; |
|
$this->password = $config['pass']; |
|
$this->profiled = $config['profile']; |
|
$this->interfaceId = ''; |
|
$this->orgId = ''; |
|
} |
|
|
|
/** |
|
* Request the authentication token |
|
* |
|
* @param none |
|
* |
|
* @return string .The authentication token |
|
* @access public |
|
*/ |
|
public function requestAuthenticationToken() { |
|
$url = $this->authentication_end_point . '/UIDAuth'; |
|
// Add the body of the request. Important. |
|
$params = <<<BODY |
|
<UIDAuthRequestMessage xmlns="http://www.ebscohost.com/services/public/AuthService/Response/2012/06/01"> |
|
<UserId>{$this->userId}</UserId> |
|
<Password>{$this->password}</Password> |
|
<InterfaceId>{$this->interfaceId}</InterfaceId> |
|
</UIDAuthRequestMessage> |
|
BODY; |
|
|
|
// Set the content type to 'application/xml'. Important, otherwise cURL will use the usual POST content type. |
|
$headers = array( |
|
'Content-Type: application/xml', |
|
'Conent-Length: ' . strlen($params) |
|
); |
|
|
|
$response = $this->request($url, $params, $headers, 'POST'); |
|
return $response; |
|
} |
|
|
|
/** |
|
* Request the session token |
|
* |
|
* @param array $headers Authentication token |
|
* |
|
* @return string .The session token |
|
* @access public |
|
*/ |
|
public function requestSessionToken($headers, $profile, $guest) { |
|
$url = $this->end_point . '/CreateSession'; |
|
|
|
// Add the HTTP query parameters |
|
$params = array( |
|
'profile' => $profile, |
|
'org' => $this->orgId, |
|
'guest' => $guest |
|
); |
|
$params = http_build_query($params); |
|
$response = $this->request($url, $params, $headers); |
|
return $response; |
|
} |
|
|
|
/** |
|
* End the session token |
|
* |
|
* @param array $headers Session token |
|
* @access public |
|
*/ |
|
public function requestEndSessionToken($headers, $sessionToken) { |
|
$url = $this->end_point . '/endsession'; |
|
|
|
// Add the HTTP query parameters |
|
$params = array( |
|
'sessiontoken' => $sessionToken |
|
); |
|
$params = http_build_query($params); |
|
$this->request($url, $params, $headers); |
|
} |
|
|
|
public function getProfiled(){ |
|
return $profiled; |
|
} |
|
|
|
/** |
|
* Request the search records |
|
* |
|
* @param array $params Search specific parameters |
|
* @param array $headers Authentication and session tokens |
|
* |
|
* @return array An associative array of data |
|
* @access public |
|
*/ |
|
public function requestSearch($params, $headers) { |
|
$url = $this->end_point . '/Search'; |
|
|
|
$response = $this->request($url, $params, $headers); |
|
return $response; |
|
} |
|
|
|
/** |
|
* Request a specific record |
|
* |
|
* @param array $params Retrieve specific parameters |
|
* @param array $headers Authentication and session tokens |
|
* |
|
* @return array An associative array of data |
|
* @access public |
|
*/ |
|
public function requestRetrieve($params, $headers) { |
|
$url = $this->end_point . '/Retrieve'; |
|
|
|
$response = $this->request($url, $params, $headers); |
|
return $response; |
|
} |
|
|
|
/** |
|
* Request the info data |
|
* |
|
* @param null $params Not used |
|
* @param array $headers Authentication and session tokens |
|
* |
|
* @return array An associative array of data |
|
* @access public |
|
*/ |
|
public function requestInfo($params, $headers) { |
|
$url = $this->end_point . '/Info'; |
|
|
|
$response = $this->request($url, $params, $headers); |
|
return $response; |
|
} |
|
|
|
/** |
|
* Send an HTTP request and inspect the response |
|
* |
|
* @param string $url The url of the HTTP request |
|
* @param array $params The parameters of the HTTP request |
|
* @param array $headers The headers of the HTTP request |
|
* @param array $body The body of the HTTP request |
|
* @param string $method The HTTP method, default is 'GET' |
|
* |
|
* @return object SimpleXml |
|
* @access protected |
|
*/ |
|
protected function request($url, $params = null, $headers = null, $method = 'GET') { |
|
$log = fopen('curl.log', 'w'); // for debugging cURL |
|
$xml = false; |
|
//$return = false; |
|
// Create a cURL instance |
|
$ch = curl_init(); |
|
|
|
// Set the cURL options |
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); |
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); |
|
curl_setopt($ch, CURLOPT_VERBOSE, true); |
|
curl_setopt($ch, CURLOPT_STDERR, $log); // for debugging cURL |
|
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Termporary |
|
// Set the query parameters and the url |
|
if (empty($params)) { |
|
// Only Info request has empty parameters |
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
} |
|
else { |
|
// GET method |
|
if ($method == 'GET') { |
|
$url .= '?' . $params; |
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
// POST method |
|
} |
|
else { |
|
curl_setopt($ch, CURLOPT_URL, $url); |
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $params); |
|
} |
|
} |
|
|
|
// Set the header |
|
if (!empty($headers)) { |
|
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); |
|
} |
|
|
|
// Send the request |
|
$response = curl_exec($ch); |
|
|
|
//Save XML file for debug mode |
|
if (strstr($url, 'Search')) { |
|
$_SESSION['resultxml'] = $response; |
|
} |
|
if (strstr($url, 'Retrieve')) { |
|
$_SESSION['recordxml'] = $response; |
|
} |
|
// Parse the response |
|
// In case of errors, throw 2 type of exceptions |
|
// EBSCOException if the API returned an error message |
|
// Exception in all other cases. Should be improved for better handling |
|
if ($response === false) { |
|
fclose($log); // for debugging cURL |
|
throw new Exception(curl_error($ch)); |
|
curl_close($ch); |
|
} |
|
else { |
|
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); |
|
fclose($log); // for debugging cURL |
|
curl_close($ch); |
|
switch ($code) { |
|
case self::HTTP_OK: |
|
$xml = simplexml_load_string($response); |
|
if ($xml === false) { |
|
throw new Exception('Error while parsing the response.'); |
|
} |
|
else { |
|
return $xml; |
|
} |
|
break; |
|
case self::HTTP_BAD_REQUEST: |
|
$xml = @simplexml_load_string($response); |
|
if ($xml === false) { |
|
throw new Exception('Error while parsing the response.'); |
|
} |
|
else { |
|
// If the response is an API error |
|
$error = ''; |
|
$code = 0; |
|
$isError = isset($xml->ErrorNumber) || isset($xml->ErrorCode); |
|
if ($isError) { |
|
if (isset($xml->DetailedErrorDescription) && !empty($xml->DetailedErrorDescription)) { |
|
$error = (string) $xml->DetailedErrorDescription; |
|
} |
|
else if (isset($xml->ErrorDescription)) { |
|
$error = (string) $xml->ErrorDescription; |
|
} |
|
else if (isset($xml->Reason)) { |
|
$error = (string) $xml->Reason; |
|
} |
|
if (isset($xml->ErrorNumber)) { |
|
$code = (integer) $xml->ErrorNumber; |
|
} |
|
else if (isset($xml->ErrorCode)) { |
|
$code = (integer) $xml->ErrorCode; |
|
} |
|
throw new EBSCOException($error, $code); |
|
} |
|
else { |
|
throw new Exception('The request could not be understood by the server |
|
due to malformed syntax. Modify your search before retrying.'); |
|
} |
|
} |
|
break; |
|
case self::HTTP_NOT_FOUND: |
|
throw new Exception('The resource you are looking for might have been removed, |
|
had its name changed, or is temporarily unavailable.'); |
|
break; |
|
case self::HTTP_INTERNAL_SERVER_ERROR: |
|
throw new Exception('The server encountered an unexpected condition which prevented |
|
it from fulfilling the request.'); |
|
break; |
|
// Other HTTP status codes |
|
default: |
|
throw new Exception('Unexpected HTTP error.'); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
} |
|
|
|
?>
|