使用Chalice时无法访问请求json_body

pprl5pva  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(102)

我正在尝试向使用AWS包Chalice的python API发出curl请求。
当我尝试访问app.current_request.json_body时,抛出了一个JSON解析错误。不知道为什么会这样。我的JSON格式是正确的,据我所知。
下面是curl请求:

(echo -n '{"data": "test"}') |
curl -H "Content-Type: application/json"  -d @-  $URL

下面是python Chalice代码:

app = Chalice(app_name='predictor')

@app.route('/', methods=['POST'], content_types=['application/json'])
def index():
    try:
        body = app.current_request.json_body
    except Exception as e:
        return  {'error':  str(e)}

当我使用上面的curl请求调用路由时,我得到以下错误:
{"error": "BadRequestError: Error Parsing JSON"}
注意:当我从app.current_request中删除.json_body时。我不再犯错误了。
有什么想法吗

utugiqy6

utugiqy61#

documentation确实表明问题是Content-Type:
视图函数的默认行为支持application/json的请求体。当使用application/json的Content-Type发出请求时,app.current_request.json_body属性会自动设置。此值是解析的JSON主体。
您还可以配置视图功能以支持其他内容类型。您可以通过为应用指定content_types参数值来完成此操作。路由功能此参数是可接受的内容类型的列表。
它表明改变Content-Type可能会使json_body工作,但我没有成功。
但是使用app.current_request.raw_body.decode()而不是app.current_request.json_body解决了这个问题。

mzmfm0qo

mzmfm0qo2#

我在使用Chalice测试客户端编写功能测试时遇到了同样的问题。我必须在装饰器和我用客户端构建的请求中设置内容类型。
我的路由配置如下:

@app.route("/allocate", methods=["POST"], content_types=["application/json"])
def allocate():
  ...
  line = OrderLine(**app.current_request.json_body)
  ...

测试:

client.http.post(
    "/allocate",
    body=json.dumps({...}),
    headers = {"Content-Type": "application/json"},
  )

希望这对某人有用!

相关问题