我是API的新手,我正在尝试创建一个应用程序,该应用程序将从Cornerstone OnDemand LMS提供的OData API中获取一些数据。它称为Reporting API。 Cornerstone OnDemand文档说,我需要获取API密钥和API机密,然后获取会话令牌。它说明了生成API会话签名之前的过程,并提供了示例PHP代码。但是,我不确定在生成签名后如何超越此范围。
这是Cornerstone OnDemand文档中提供的示例PHP代码。
//signature to acquire a session
$apiId = '<insert Api ID>';
$apiSecret = '<Insert API Secret>';
//build the string to sign
//note the order of the entries is important.
//The http headers must be in alphabetical order by key name
$httpMethod = 'POST';
$apiKey = 'x-csod-api-key:'.$apiId;
$httpUrl = '/services/api/sts/session';
date_default_timezone_set('UTC');
$date = 'x-csod-date:'.date('Y-m-d').'T'.date('H:i:s').'.000';
$stringToSign = $httpMethod."\n".$apiKey."\n".$date."\n".$httpUrl;
/* produces the following string:
* POST\nx-csod-api-key:1lie8ficql9h5\nx-csod-date:2015-09-08T11:27:32.000\n/services/api/sts/session
*/
//Generate the signature
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(hash_hmac('sha512', $stringToSign, $secretKey, true));
我不确定生成签名后该怎么办。可以在https://github.com/csodedge/csod-rest-api-sample-code-POST的Cornerstone OnDemand的GitHub存储库上找到REST API示例C#代码,但是找不到任何可用于PHP的东西。
我期待着StackOverflow社区的帮助。我将非常感谢您的帮助。
编辑1: 经过研究,我发现我需要形成标题并使用Curl发送请求。我添加了curl代码,但是现在收到错误的请求错误。这是更新的代码。非常感谢您的帮助。
//signature to acquire a session
$apiId = '<removed for safety>';
$apiSecret = '<removed for safety>';
//build the string to sign
//note the order of the entries is important.
//The http headers must be in alphabetical order by key name
$httpMethod = 'POST';
$apiKey = 'x-csod-api-key:'.$apiId;
$httpUrl = 'https://clientdomain.csod.com/services/api/sts/session?userName=clientuserid&alias=jk01';
date_default_timezone_set('UTC');
$date = 'x-csod-date:'.date('Y-m-d').'T'.date('H:i:s').'.000';
$stringToSign = $httpMethod."\n".$apiKey."\n".$date."\n".$httpUrl;
//Generate the signature
$secretKey = base64_decode($apiSecret);
$signature = base64_encode(hash_hmac('sha512', $stringToSign, $secretKey, true));
$crl = curl_init();
curl_setopt($crl, CURLOPT_URL, $httpUrl);
curl_setopt($crl, CURLOPT_HTTPHEADER, array (
'x-csod-api-key: '.$apiId,
'x-csod-date: '.date('Y-m-d').'T'.date('H:i:s').'.000',
'x-csod-signature: '.$signature
));
curl_setopt($crl, CURLOPT_POST,true);
$rest = curl_exec($crl);
if ($rest === false)
{
// throw new Exception('Curl error: ' . curl_error($crl));
print_r('Curl error: ' . curl_error($crl));
}
curl_close($crl);
print_r($rest);
此代码现在给我以下错误:
错误请求 您的浏览器发送了该服务器无法理解的请求。 参考#7.9dde387d.1532191458.b66f123 1
请帮助。