对于Rest API,我必须连接由换行符分隔的字符串。此字符串用于HMAC计算。
我已经尝试过使用不同的十六进制值作为分隔符,例如x'25'x'13'x'10',但是没有提供预期的HMAC。
// working PHP example
//
// variables
$method = "POST";
$uri = "https://www.real.de/api/v1/units/";
$body = "";
$timestamp = 1411055926;
$secretKey = "a7d0cb1da1ddbc86c96ee5fedd341b7d8ebfbb2f5c83cfe0909f4e57f05dd403";
//
function signRequest($method, $uri, $body, $timestamp, $secretKey)
{
$string = implode("\n", [ $method, $uri, $body, $timestamp, ]);
return hash_hmac('sha256', $string, $secretKey);
}
// expected HMAC
// 75312eabe66e4b9e74552a5e8959456d69cfa52a7cae9049093aede4bcdf71e7
// code RPGLE
yLf = x'25';
yString = %trim(yMethod)
+ yLf
+ %trim(yUrl)
+ yLf
+ %trim(yBody)
+ yLf
+ %trim(yTima);
// the string and the secret key then are converted to ASCII
// the HMAC is calculated by the API 'Qc3CalculateHMAC'
RPGLE生成的HMAC与预期的HMAC不匹配。使用不含换行符的字符串进行测试时,一切正常。
答案 0 :(得分:0)
回答您的问题...
假设您正在使用英语系统EBCDIC CCSID 37,那么您想使用EBCDIC x'0d'
用于回车,x'25'
用于换行。
这些值将分别转换为ASCII CR x'0d'
和LF x'0a'
。
但是看来您已经使用了正确的十六进制值。
如何转换为ASCII? iconv()API是最佳选择...
假设您使用的是受支持的IBM i版本...您可能能够利用RPG对CCSID支持的增强功能来隐式转换EBCDIC字符串...
dcl-s var1 char(100) ccsid(*utf8); // special value *UTF8 = CCSID 1208
dcl-s var2 char(100) ccsid(00367); // ANSI X3.4 ASCII standard; USA
dcl-s var3 char(100) ccsid(00437); // PC Data; PC Base; USA
还取决于您用于发送HTTP请求的内容。
答案 1 :(得分:0)
'\ n'是“换行符”,x'15'。
答案 2 :(得分:0)
尚未在RPG中找到解决方案,我正在从RPG调用PHP脚本作为解决方法。