无法将方法响应标头Content-Type更改为application / xml

时间:2017-01-08 09:17:31

标签: amazon-web-services lambda twilio swagger aws-api-gateway

尝试解决Twilio 12300错误:使用AWS的API网关(GET)和CloudFormation通过aws cli和Swagger部署Lambda(无服务器)应用程序时导致的内容类型无效。

我有集成响应主体映射模板> Content-Type设置为application/xml和模板

#set($inputRoot = $input.path('S'))
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Message>
    <Body>
      $inputRoot
    </Body>
  </Message>
</Response>

检查来自Twilio日志的实际Response Body,输出与模板匹配,返回格式正确的XML响应。

然而,响应标题&gt; Content-Type仍然会返回application/json

似乎这需要在Method Response中进行设置更改,但AWS API Gateway仪表板和/或Swagger API不允许我设置Header&gt;内容类型为application/xml

以下是swagger.yaml文件

---
swagger: "2.0"
info:
  version: "2016-12-20T18:27:47Z"
  title: "twilio-apigateway"
basePath: "/Prod"
schemes:
- "https"
paths:
  /addphoto:
    get:
      consumes:
      - "application/json"
      produces:
      - "application/xml"
      responses:
        200:
          description: "200 response"
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
            responseTemplates:
              application/xml: "#set($inputRoot = $input.path('$'))\n<?xml version=\"\
                1.0\" encoding=\"UTF-8\"?>\n<Response>\n    <Message>\n        <Body>\n\
                \            $inputRoot\n        </Body>\n    </Message>\n</Response> "
        requestTemplates:
          application/json: "{\n    \"body\" : \"$input.params('Body')\",\n    \"\
            fromNumber\" : \"$input.params('From')\",\n    \"image\" : \"$input.params('MediaUrl0')\"\
            ,\n    \"numMedia\" : \"$input.params('NumMedia')\"\n}"
        # NOTE: Replace <<region>> and <<account>> fields
        uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:<<cccount_id>>:function:${stageVariables.LambdaFunctionName}/invocations
        passthroughBehavior: "when_no_templates"
        httpMethod: "POST"
        contentHandling: "CONVERT_TO_TEXT"
        type: "aws"

在这里解决这个问题的任何人都会喜欢这里的帮助。虽然这似乎是一个已知问题(Twilio需要XML格式),但AWS Swagger API在某些方面受到限制,这可能会导致无法解析的状态。

其他参考资料:

http://docs.aws.amazon.com/fr_fr/apigateway/latest/developerguide/api-gateway-swagger-extensions.html

http://boto3.readthedocs.io/en/latest/reference/services/apigateway.html

1 个答案:

答案 0 :(得分:3)

您是否尝试过方法响应和集成响应?

    "responses": {
      "200": {
        "description": "200 response",
        "schema": {
          "$ref": "#/definitions/Empty"
        },
        "headers": {
          "Content-Type": {
            "type": "string"
          }
        }
      }
    },
    "x-amazon-apigateway-integration": {
      "responses": {
        "default": {
          "statusCode": "200",
          "responseParameters": {
            "method.response.header.Content-Type": "'application/xml'"
          }
        }
    }