[英]Amazon Redshift Data API REST HTTP endpoint returns <UnknownOperationException/> from Salesforce Apex callouts
我在一家咨询公司工作。 我们正在尝试验证从 Salesforce 平台对 Amazon Redshift 数据 API 的传出 Apex 调用。 这最终将允许我们执行 SQL 调用并通过 Salesforce 中的 Valence 应用程序拉回结果。
我正在寻求澄清,并希望有一个我正在尝试构建的请求的基本示例,这样我们就可以找到一个起点。
具体来说 - 我们正在尝试使用 DescribeTable 操作提交基本的 POST 请求以获取一些响应,但我们所能得到的只是响应正文中的一个错误,以 XML 格式显示“UnknownOperationException”。 我们很乐意在这一点上得到一个不同的错误,这样我们就可以有一些方向。
目前尚不清楚我们需要包括什么 -
庞大的 Amazon 文档反复建议您使用他们的 CLI 工具访问 Redshift 数据(此处不适用),或者使用他们众多的 SDK 将身份验证编码到您的应用程序中……但是因为我们使用的是 Salesforce Apex,我们无法利用其中任何一个。
所以,我们有 2 个选择 -
要么
为简洁起见,这里有一些指向我查看过的文档的链接。 我希望我在某处遗漏了一个小细节。 基本请求代码位于底部,它返回 Redshift 标注请求的错误 -
要包含在正文中的操作和参数的描述 - 这具体来自 Redshift Data API 文档
https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_DescribeTable.html
“您可以使用 GET 或 POST 请求向 Amazon Redshift 发送请求。两者之间的区别在于,对于 GET 请求,您的参数作为查询字符串参数发送。对于 POST 请求,它们包含在请求正文中。 ” - Redshift 管理指南
https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-signing-requests.html
涉及构建规范请求的签名过程示例。 来自 AWS 一般参考。 命名凭证/签名将需要执行相同的过程
https://docs.aws.amazon.com/general/latest/gr/create-signed-request.html
我已尝试尽可能严格地遵循文档示例,但我没有收到与请求细节相关的错误,因此很难理解问题出在哪里。
我已经尝试了 DescribeTable 操作的基本 GET 和 POST 请求,但无济于事。 如果可能的话,我想坚持使用 POST,因为主体 JSON 优于查询参数 IMO。
在文档的公共参数部分,它表示每次调用都需要 Action 和 Version 参数,但其余参数取决于上下文,并且似乎只对 GET 请求是必需的。
https://docs.aws.amazon.com/redshift-data/latest/APIReference/CommonParameters.html
常见错误列表没有描述 UnknownOperationException。
https://docs.aws.amazon.com/redshift-data/latest/APIReference/CommonErrors.html
这篇文章的识别信息是虚拟的。
global class JPTestClass {
public static void jpTestMethod(){
String POSTMAN_CALLOUT = 'callout:Testing_Postman_API';
// This points to https://redshift-data.us-east-1.amazonaws.com
String REDSHIFT_CALLOUT = 'callout:Redshift_Data_API';
send(POSTMAN_CALLOUT);
send(REDSHIFT_CALLOUT);
}
public static void send(String callout){
HttpRequest request = new HttpRequest();
// parameters in the POST request body
String payloadString = JSON.serialize(new Map<String, Object>{
'Action' => 'DescribeTable',
'Version' => '2010-05-08',
'ClusterIdentifier' => '<<<XXX>>>',
'ConnectedDatabase' => '<<<XXX>>>',
'Database' => '<<<XXX>>>',
'MaxResults' => 1000,
'NextToken' => '',
'Schema' => '<<<XXX>>>',
'SecretArn' => '<<<XXX>>>',
'Table' => 'salesforce_contacts',
'WorkgroupName' => ''
});
System.debug(payloadString);
request.setEndpoint(callout + '?Action=DescribeTable&Version=2010-05-08');
request.setMethod('POST');
request.setBody(payloadString);
HttpResponse response = new Http().send(request);
System.debug(response.getBody());
}
}
这些是 Postman 在请求中收到的标头。 Salesforce 生成的授权标头。
x-forwarded-for: "xxxxxxxxx"
x-forwarded-proto: "xxxxxxxxx"
x-forwarded-port: "xxxxxxxxx"
host: "36b0a2b5-79a5-471e-ac92-06122c76dad2.mock.pstmn.io"
x-amzn-trace-id: "Root=1-639b9d8c-64700ff707de06582eafc6ce"
content-length: "263"
user-agent: "SFDC-Callout/56.0"
sfdc_stack_depth: "1"
accept: "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2"
authorization: "AWS4-HMAC-SHA256 Credential=<<<ACCESS KEY>>>/20221215/us-east-1/redshift-data/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=0be75a778aa72003cd29140ea52b3db74b6d559078efa382697f8d78b5460b7f"
x-amz-date: "20221215T221956Z"
x-amz-content-sha256: "ec4ae9564eca8bf406807d8ec6305ddbf8435095b269db6f3162b5cfcac4cad8"
accept-encoding: "gzip,deflate"
对于任何好奇的人 - 在包含这些标头后请求成功,这些标头不包含在 1) Salesforce AWS Signature 4 命名凭证或 2) 生成的 Postman 授权标头中。
我也无法通过 Redshift 数据 API 文档找到它们,但它们在其他 API 文档中有描述。
'X-Amz-Target' => 'RedshiftData.' + action, e.g. 'RedshiftData.DescribeTable'
'X-Requested-With' => 'XMLHttpRequest'
'Content-Type' => 'application/x-amz-json-1.1'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.