如何使用带有API密钥和API Secret的PHP查询OData API?获取“未设置URL!”卷曲误差

时间:2018-07-21 08:10:42

标签: php api odata

我是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

请帮助。

0 个答案:

没有答案