我尝试使用API Gateway和Lambdas在Amazon Web Service中构建RESTful服务。其中一个API网关方法旨在从S3的相应资源的DynamoDB表中返回单个记录。此资源是一个XML文件,但我不知道如何以Lambda函数作为可下载文件的方式返回此内容。 我使用Python来编写lambdas代码,到目前为止它看起来像这样:
import json
from lxml import etree
def get_item_handler(event, context):
# Validate request
# ...
# End validation
logger.info('Querying by id:{0}'.format(event["id"]))
query_kwargs = {
'Select': "ALL_ATTRIBUTES",
'Limit': event["PageSize"] if "PageSize" in event else settings.DEFAULT_PAGE_SIZE,
'KeyConditionExpression': Key('id').eq(event["id"])
}
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(settings.TABLE_NAME)
response = table.query(**query_kwargs)
if "format" in event and event["format"] and response["Items"]:
response_format = event["format"].lower()
item = json.loads(json.dumps(response['Items'], cls=DecimalEncoder))[0]
if response_format == "xml":
s3_path = get_item_path(item) # Form path to the item in S3
resource = os.path.join(s3_path , item["resource"])
local_file = '/tmp/{0}'.format(item["resource"])
s3_client = boto3.client('s3')
transfer = S3Transfer(s3_client)
transfer.download_file(settings.BUCKET_NAME, resource, local_file)
xml = etree.parse(local_file)
return etree.tostring(xml)
return json.dumps(response['Items'], cls=DecimalEncoder)
API网关设置为application / xml,它返回一个带有xml内容的字符串,但这不是我想要的,我需要将XML作为文件返回。
答案 0 :(得分:3)
由于Zanon已经回复,您需要为Content-Type设置响应标头:application / xml和Content-Disposition:attachment;文件名= “myfile.xml中”。
听起来你已经有了Content-Type:application / xml。
设置Content-Disposition:附件; filename =“myfile.xml”标头,首先转到方法的“方法响应”页面。在“HTTP状态”下,单击200行左侧的三角形/箭头以展开它。然后单击“添加标题”。输入Content-Disposition作为标题名称,然后单击复选框图标进行保存。这声明响应将发送Content-Disposition标头。接下来,您必须将值映射到标题。为此,请转到方法的“集成响应”页面。展开200行和Header Mappings部分。在Header Mappings下,您现在应该看到Content-Disposition。单击Content-Disposition右侧的Mapping值空间,为其定义映射。在这种情况下,我们可以只使用一个常量值,所以输入'attachment;文件名= “myfile.xml中””。请务必包含单引号。然后单击复选标记图标以保存。
您现在应该可以通过控制台测试API方法,并查看Content-Disposition标头设置为附件;文件名= “myfile.xml中”。请记住重新部署您的API,让更改在控制台之外生效。
答案 1 :(得分:1)
对于可下载文件,您需要设置两个响应标头:
Content-Type: application/xml
Content-Disposition: attachment; filename="myfile.xml"
此设置在API网关中完成。您说您已经配置了Content-Type
,所以我相信您现在需要的是配置Content-Disposition
。