簡體   English   中英

AWS API Gateway-集成響應正文映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM