[英]AWS API Gateway - Integration Response body mapping
在AWS API Gateway Integration响应主体映射中,我具有以下代码:
#set($inputRoot = $input.path('$.Item'))
[
#foreach($elem in $inputRoot.Events)
{
"id": $elem.id,
"from" : $elem.from,
"to" : $elem.to,
"spent" : $elem.spent,
#if("$!elem.comment" != "")
"comment": $elem.comment,
#end
"project" : {
"id" : $elem.project.id,
"number" : $elem.project.number,
"name" : $elem.project.name
}
}
#if($foreach.hasNext),#end
#end
]
数据来自查询DynamoDB表的lambda函数
API网关返回如下数据:
[
{
"id": 123443214,
"from" : 19:34,
"to" : 22:30,
"spent" : 02:56,
"project" : {
"id" : 4321,
"number" : CIB,
"name" : Backend
}
}
, {
"id": 12341234,
"from" : 19:34,
"to" : 22:30,
"spent" : 02:56,
"project" : {
"id" : 12341234,
"number" : CIB,
"name" : Backend
}
}
]
因此它已经被格式化。 如何获得APi网关返回未格式化的响应? 因此,它只是纯json,没有换行符,缩进等?
提前致谢!
(简短的初步说明:您缺少JSON字符串值周围的一些引号)。
可以使用##
删除换行符,并使用#**#
删除缩进符,如下所示,但是模板看起来有点难看:
#set($inputRoot = $input.path('$.Item'))##
[##
#foreach($elem in $inputRoot.Events)##
{##
#**#"id":$elem.id,##
#**#"from": $elem.from,##
#**#"to":$elem.to,##
#**#"spent":$elem.spent,##
#if("$!elem.comment" != "")##
#* *#"comment":$elem.comment,##
#end##
#**#"project":{##
#**#"id":$elem.project.id,##
#**#"number":"$elem.project.number",##
#**#"name":"$elem.project.name"##
}##
}##
#if($foreach.hasNext),#end##
#end##
]##
由于缩进首先出现在这里的唯一原因是模板的可读性,所以我会去另一个方向。
例如,您可以使用org.json在View servlet中添加一个后处理整洁格式化程序:
import org.json.JSONObject;
....
Writer writer = new StringWriter();
getVelocityView().merge(template, context, writer);
String compactJSON = new JSONObject(writer.toString()).toString();
response.getWriter().write(compactJSON);
但这仅适用于小型JSON文件,因为响应已缓冲到内存中,因此让我们继续寻找更优雅的解决方案。
解决方法是使用自定义的ResouceLoader 预处理模板。
CompactJSONResourceLoader.java
package my.custom.loader;
import java.io.InputStream;
import java.io.IOException;
import org.apache.commons.collections.ExtendedProperties;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.resource.Resource;
import org.apache.velocity.runtime.resource.loader.ResourceLoader;
import org.apache.velocity.runtime.resource.loader.ResourceLoaderFactory;
public class CompactJSONResourceLoader extends ResourceLoader
{
protected ResourceLoader innerLoader = null;
@Override
public void init(ExtendedProperties configuration)
{
try
{
String innerLoaderID = configuration.getString("innerLoader") + ".resource.loader";
String innerLoaderClass = rsvc.getConfiguration().getString(innerLoaderID + ".class");
innerLoader = ResourceLoaderFactory.getLoader(rsvc, innerLoaderClass);
ExtendedProperties innerConfiguration = rsvc.getConfiguration().subset(innerLoaderID);
innerLoader.commonInit(rsvc, innerConfiguration);
innerLoader.init(innerConfiguration);
}
catch (Exception e)
{
log.error("could not initialize CompactJSONResourceLoader inner loader", e);
}
}
protected class CompactJSONInputStream extends InputStream
{
InputStream innerStream = null;
boolean insideQuotes = false;
public CompactJSONInputStream(InputStream innerStream)
{
this.innerStream = innerStream;
}
@Override
public int read() throws IOException
{
int ch;
do
{
ch = innerStream.read();
if (insideQuotes)
{
if (ch == '"') insideQuotes = false;
break;
}
else if (!Character.isWhitespace(ch))
{
if (ch == '"') insideQuotes = true;
break;
}
}
while (ch != -1);
return ch;
}
}
@Override
public InputStream getResourceStream(String source) throws ResourceNotFoundException
{
return new CompactJSONInputStream(innerLoader.getResourceStream(source));
}
@Override
public boolean isSourceModified(Resource resource)
{
return innerLoader.isSourceModified(resource);
}
@Override
public long getLastModified(Resource resource)
{
return innerLoader.getLastModified(resource);
}
}
然后,您需要使用以下属性配置Velocity:
resource.loader = compact
compact.resource.loader.class = my.custom.loader.CompactJSONResourceLoader
compact.resource.loader.innerLoader =文件
(当然,您可以将file
替换为当前使用的资源加载器)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.