尝试解决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://boto3.readthedocs.io/en/latest/reference/services/apigateway.html
答案 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'"
}
}
}