如何在API网关响应映射中使用正则表达式捕获组

时间:2018-05-09 18:00:54

标签: regex amazon-web-services aws-api-gateway

我正在尝试将Lambda抛出的异常中的一些数据映射到API网关响应,但是遇到了问题。

例如,我有一个可以抛出异常的Lambda:

User some-user-id exists: java.lang.IllegalStateException
java.lang.IllegalStateException: User some-user-id exists
at u.c.c.e.s.lambda.user.handler.RegisterNewUserRequestHandler.handleRequest(RegisterNewUserRequestHandler.java:68)
Caused by: com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException: The conditional request failed (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ConditionalCheckFailedException; Request ID: UONMOKNKVSEIL8EI6T6NVPODOJVV4KQNSO5AEMVJF66Q9ASUAAJG)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1630)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1302)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:3082)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3058)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeUpdateItem(AmazonDynamoDBClient.java:2778)
at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:2753)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:854)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:594)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:733)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:623)
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.save(AbstractDynamoDBMapper.java:128)
at uk.co.claritysoftware.exam.slammr.lambda.user.handler.RegisterNewUserRequestHandler.saveNewUserIfNotExists(RegisterNewUserRequestHandler.java:97)
at uk.co.claritysoftware.exam.slammr.lambda.user.handler.RegisterNewUserRequestHandler.handleRequest(RegisterNewUserRequestHandler.java:63)

我写了一个正则表达式来匹配错误信息,但我想从错误中提取用户ID;我希望使用一个捕获组,然后在映射中引用它,如下所示:

enter image description here

但它不起作用 - $1似乎被视为字符串文字。

作为解决方法,我使用此映射模板映射异常消息:

#set($inputRoot = $input.path('$'))
{
  "message" : "$inputRoot.errorMessage"
}

但这是妥协,因为它映射了原生的Lambda消息,虽然在这种情况下足够接近,但感觉不对,因为我依赖Lambda抛出一个带有合理合理的异常消息的异常,并且感觉类似于将本机异常消息暴露给前端,我们知道这是不好的做法。

我有什么想法可以做到这一点吗?

编辑

回答评论中提出的问题:

  1. (i)图标在悬停时显示: enter image description here
  2. 尝试使用\1\$1转义群组引用,导致\1\$1以字符串文字的形式返回到响应中。

0 个答案:

没有答案