我尝试通过JavaScript SDK调用API Gateway端点时设置路径参数,但没有任何运气。看起来我要么配置错误,要么SDK生成中存在错误。
我能够成功调用不接受路径参数的端点,但是当我尝试传入一个参数用作路径参数时,SDK只是将路径参数替换为空白而我的调用失败。
示例,假设client
是正确初始化的API网关客户端。我有一个名为/measurement
的端点,其子级为/measurement/{id}
。我可以直接打电话。
client.measurementGet({},{});
- 成功调用我的/measurement
端点
client.measurementIdGet({"id": "1234"}, {});
- 浏览器拨打/measurement/
而不是/measurement/1234
查看我的apigClient.js的来源,似乎SDK生成器没有将路径参数放入它正在寻找的参数列表中。例如,我生成的measurementIdGet
方法的代码如下所示:
apigClient.measurementIdGet = function (params, body, additionalParams) {
if(additionalParams === undefined) { additionalParams = {}; }
apiGateway.core.utils.assertParametersDefined(params, [], ['body']);
var measurementIdGetRequest = {
verb: 'get'.toUpperCase(),
path: pathComponent + uritemplate('/measurement/{id}').expand(apiGateway.core.utils.parseParametersToObject(params, [])),
headers: apiGateway.core.utils.parseParametersToObject(params, []),
queryParams: apiGateway.core.utils.parseParametersToObject(params, []),
body: body
};
return apiGatewayClient.makeRequest(measurementIdGetRequest, authType, additionalParams, config.apiKey);
};
我挖掘了assertParametersDefined
和parseParametersToObject
,看起来这些方法需要查找参数列表。在这两种情况下,SDK都生成了空列表,而不是将路径参数放在那里。
如果我手动更新生成的文件,将两行更改为
apiGateway.core.utils.assertParametersDefined(params, ['id'], ['body']);
和
apiGateway.core.utils.parseParametersToObject(params, ['id'])
SDK正确调用。
我在配置中遗漏了什么或者代码生成器中是否有错误?
答案 0 :(得分:1)
如果您正在使用像我这样的云形成。您需要将其添加到RequestParameters。
中对于像这样的资源/ api / pets / {id} / attributes / {attrid}代码工作
PetsByIdAttributesByAttridGetMethod:
Type: 'AWS::ApiGateway::Method'
Properties:
RestApiId: !Ref MyApi
ResourceId: !Ref PetsByIdAttributesByAttridResource
HttpMethod: GET
AuthorizationType: AWS_IAM
RequestParameters:
method.request.path.id : true
method.request.path.attrid : true
Integration:
Type: AWS_PROXY
IntegrationHttpMethod: POST
Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyLambda.Arn}/invocations
答案 1 :(得分:0)
假设您正在导入一个swagger定义来创建API,那么在方法级别而不是路径级别定义parameters
将导致生成的SDK填充key
out并且应该正常工作。
{
...
"/path/{to}/resource": {
"get": {
"parameters": [ // define here
"name": "to",
"in": "path",
...
],
...
},
"parameters": [] // not here
}
虽然根据Swagger规范在路径级定义parameters
是正确的,并且API网关确实在创建的API中使用它们,但似乎API Gateway在某些情况下忽略它们。
答案 2 :(得分:0)
这看起来像是一个问题,无法解析参数。
https://github.com/aws/chalice/issues/498 enter link description here