【问题标题】:Get raw POST payload in Flask在 Flask 中获取原始 POST 有效负载
【发布时间】:2017-02-27 18:41:03
【问题描述】:

我正在通过 cUrl 发送文本

curl -X POST -d "Separate account charge and opdeducted fr" http://192.168.50.8/text

并尝试得到

@application.route("/text",methods=['POST'])
def clausIE():
      content = request.data
      text = str(content, encoding="utf-8")

但是得到空字符串,我做错了什么?

注意:我用的是Python3.6

【问题讨论】:

  • 嗯,你需要在条款IE中返回一些东西。
  • 使用request.get_data() 代替request.data 应该可以解决问题。

标签: python python-3.x curl post flask


【解决方案1】:

这并不是真正的 Flask 问题,您使用了错误的 curl 选项。

-d 开关只能用于表单数据。 curl 会自动将 Content-Type 标头设置为 application/x-www-form-urlencoded,这意味着 Flask 将加载原始正文内容并将其解析为表单。您必须手动设置不同的 Content-Type 标头,使用 -H 'Content-Type: application/octet-stream' 或其他更适合您的数据的 mime-type。

您还想使用--data-binary,而不是-d (--data),因为后者也会尝试将内容解析为键值字段并删除换行符:

curl -X POST -H 'Content-Type: application/octet-stream' \
   --data-binary "Separate account charge and opdeducted fr" \
   http://192.168.50.8/text

【讨论】:

    【解决方案2】:

    完整的答案似乎分散在一些 cmets 和接受的回复中。所以总结一下,Python Flask 代码应该是这样的

    @application.route("/text",methods=['POST'])
    def clausIE():
        content = request.get_data()
    
        text = str(content, encoding="utf-8") 
    
        return text
    

    这就是你应该在终端上拥有的东西

    curl -X POST --data-binary "Hello World!" http://192.168.50.8/text
    

    在我自己的设置 (OS X) 中,我可以删除 -X POST 并将 URL 括在引号中,这样就可以提供

    curl --data-binary "Hello World!" "http://192.168.50.8/text"
    

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多