Python aws-lambda将xml文件返回给aws-api-gateway

时间:2016-02-12 18:55:48

标签: python aws-lambda aws-api-gateway

我尝试使用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作为文件返回。

2 个答案:

答案 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