使用aws java sdk为aws lambda配置路径参数

3b6akqbq  于 2021-08-25  发布在  Java
关注(0)|答案(0)|浏览(286)

我使用java创建了aws lambda,并使用localstack进行测试。给定一个资源,我想要一个 add , getremove 操作和相应的rest端点 POST , GETDELETE . 对于创建,我有一个处理程序:

  1. class AddHandler implements RequestStreamHandler {
  2. @Override
  3. public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
  4. //...
  5. }

它希望在消息体中有一个dto,从而生成一个 UUID 唯一标识该对象的。
为了测试,我正在使用 com.amazonaws maven存储库中提供的用于上载lambda文件的库,对于本地环境,localstack充当aws。
一旦我上传了lambda文件并准备好了,我就开始创建一个 CreateRestApiRequest 使用 com.amazonaws.services.apigateway.AmazonApiGateway :

  1. CreateRestApiRequest createRestApiRequest = new CreateRestApiRequest();
  2. createRestApiRequest.setName(bucketName);
  3. createRestApiRequest.setRequestCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials));
  4. amazonApiGateway.createRestApi(createRestApiRequest);

然后,使用生成的rest api id创建一个资源:

  1. CreateResourceRequest createResourceRequest = new CreateResourceRequest();
  2. createResourceRequest.setRestApiId(restApiId);
  3. createResourceRequest.setParentId(resource.getId());
  4. createResourceRequest.setPathPart(path);
  5. createResourceRequest.setRequestCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials));
  6. amazonApiGateway.createResource(createResourceRequest);

我还创建了一个putmethodrequest

  1. PutMethodRequest putMethodRequest = new PutMethodRequest();
  2. putMethodRequest.setRestApiId(restApiId);
  3. putMethodRequest.setResourceId(resourceId);
  4. putMethodRequest.setHttpMethod(httpMethod);
  5. putMethodRequest.setAuthorizationType("None");
  6. putMethodRequest.setApiKeyRequired(false);
  7. putMethodRequest.setRequestCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials));
  8. PutMethodResult result = amazonApiGateway.putMethod(putMethodRequest);

和putintegrationrequest:

  1. PutIntegrationRequest putIntegrationRequest = new PutIntegrationRequest();
  2. putIntegrationRequest.setHttpMethod(httpMethod);
  3. putIntegrationRequest.setIntegrationHttpMethod(httpMethod);
  4. putIntegrationRequest.setRestApiId(restApiId);
  5. putIntegrationRequest.setResourceId(resourceId);
  6. putIntegrationRequest.setRequestCredentialsProvider(new AWSStaticCredentialsProvider(awsCredentials));
  7. putIntegrationRequest.setType(IntegrationType.AWS_PROXY);
  8. putIntegrationRequest.setUri("arn:aws:apigateway:" + region + ":lambda:path"
  9. + "/2015-03-31/functions/" + functionArn + "/invocations");
  10. putIntegrationRequest.setContentHandling(ContentHandlingStrategy.CONVERT_TO_TEXT);
  11. PutIntegrationResult result = amazonApiGateway.putIntegration(putIntegrationRequest);

注意:更多的步骤是需要的,但为了简单起见,我不包括他们-如果必要的话,我可以编辑这篇文章添加更多。
最后,我可以使用url在localstack中触发lambda,例如:

  1. https://localhost:4566/restapis/{restApiId}/test/_user_request_/{functionName}

以及包含数据的json主体,该主体按预期工作。我发现这种方法对客户来说非常合适 POST 操作,但是我希望 GETDELETE 将资源标识作为路径参数执行的请求,而不是将其发送到正文中,例如,符合以下条件的请求:

  1. https://localhost:4566/restapis/{restApiId}/test/_user_request_/{functionName}/{resourceId}

到目前为止,我还不知道如何做到这一点,有人知道我的代码中缺少的部分吗?
非常感谢你的帮助。比尔。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题