2016-02-12 3 views
1

Я пытаюсь создать службу RESTful в веб-службе Amazon с помощью API Gateway и Lambdas. Один из методов API Gateway предназначен для возврата одной записи из таблицы DynamoDB соответствующего ресурса из S3. Этот ресурс является XML-файлом, но я не знаю, как вернуть это содержимое из функции Lambda таким образом, чтобы он служил загружаемым файлом. Я использую Python для кодирования лямбды, и до сих пор это выглядит следующим образом:Python aws-lambda возвращает xml-файл в aws-api-gateway

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-интерфейс шлюз устанавливается в приложении/XML, и он возвращает строку с содержимым XML, но это не что я хочу, мне нужно вернуть XML как файл.

ответ

3

Поскольку Zanon уже ответил, вам нужно установить заголовки ответов для Content-Type: application/xml и Content-Disposition: attachment; имя файла = "myfile.xml".

Похоже, что у вас уже есть приложение Content-Type: application/xml.

Чтобы установить Content-Disposition: attachment; filename = "myfile.xml", сначала перейдите на страницу Method Response для вашего метода. В разделе «Статус HTTP» щелкните треугольник/стрелку слева от линии 200, чтобы развернуть его. Затем нажмите «Добавить заголовок». Введите Content-Disposition в качестве имени заголовка и нажмите на значок флажка для сохранения. Это заявляет, что ответ отправит заголовок Content-Disposition. Затем вам нужно сопоставить значение с заголовком. Для этого перейдите на страницу «Ответ на интеграцию» для вашего метода. Разверните раздел «200» и «Сопоставление заголовков». В разделе «Заголовки заголовков» вы должны увидеть Content-Disposition. Нажмите на поле «Сопоставление» справа от Content-Disposition, чтобы определить для него сопоставление. В этом случае мы можем просто использовать постоянное значение, поэтому введите 'attachment; имя файла = "myfile.xml". Не забудьте включить одинарные кавычки. Затем нажмите значок галочки для сохранения.

Теперь вы можете протестировать свой метод API через консоль и увидеть, что заголовок Content-Disposition установлен на вложение; имя файла = "myfile.xml". Не забудьте повторно развернуть API, чтобы изменения вступили в силу за пределами консоли.

1

Для загружаемого файла, вам необходимо установить два заголовка ответа:

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

Эта настройка выполняется в API шлюза. Вы сказали, что уже настроили Content-Type, поэтому я считаю, что вам нужно настроить Content-Disposition.

+0

Как установить Content-Disposition ?, Я только нахожу параметр Content-Type. благодаря – Yasel

Смежные вопросы