Python aws lambda将xml文件返回到aws api网关

Python aws lambda将xml文件返回到aws api网关,python,aws-lambda,aws-api-gateway,Python,Aws Lambda,Aws Api Gateway,我正在尝试使用API网关和Lambdas在AmazonWeb服务中构建一个RESTful服务。API网关方法之一旨在从DynamoDB表返回来自S3的相应资源的单个记录。此资源是一个XML文件,但我不知道如何从Lambda函数返回此内容,使其作为可下载文件。 我正在使用Python对lambdas进行编码,到目前为止,它看起来是这样的: import json from lxml import etree def get_item_handler(event, context): #

我正在尝试使用API网关和Lambdas在AmazonWeb服务中构建一个RESTful服务。API网关方法之一旨在从DynamoDB表返回来自S3的相应资源的单个记录。此资源是一个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作为文件返回。

对于可下载的文件,您需要设置两个响应头:

Content-Type: application/xml
Content-Disposition: attachment; filename="myfile.xml"

此设置在API网关中完成。你说你已经配置了
内容类型
,所以我相信你现在需要的是配置
内容配置

因为Zanon已经响应了,你需要为内容类型设置响应头:application/xml和内容配置:attachment;filename=“myfile.xml”

听起来您已经有了内容类型:application/xml-working

设置内容配置:附件;filename=“myfile.xml”标题,首先转到方法的方法响应页面。在“HTTP状态”下,单击200行左侧的三角形/箭头将其展开。下一步单击“添加标题”。输入Content Disposition作为标题名称,然后单击复选框图标进行保存。这声明响应将发送内容处置头。接下来,您必须将一个值映射到标题。为此,请转到方法的集成响应页面。展开200行和标题映射部分。在标题映射下,您现在应该看到内容配置。单击内容处置右侧的映射值空间,为其定义映射。在这种情况下,我们可以使用一个常量值,所以输入'attachment;filename=“myfile.xml””。确保包含单引号。然后单击复选标记图标进行保存


您现在应该能够通过控制台测试您的API方法,并看到Content Disposition头被设置为attachment;filename=“myfile.xml”。请记住重新部署API,以使更改在控制台之外生效。

如何设置内容配置?我只找到内容类型设置。谢谢