【问题标题】:How to send urlencoded parameters in POST request in python如何在python的POST请求中发送urlencoded参数
【发布时间】:2017-12-11 09:11:46
【问题描述】:

我正在尝试将我的生产就绪代码部署到 Heroku 以对其进行测试。不幸的是,它不采用 JSON 数据,因此我们转换为 x-www-form-urlencoded。

params = urllib.parse.quote_plus(json.dumps({
    'grant_type': 'X',
    'username': 'Y',
    'password': 'Z'
}))
r = requests.post(URL, data=params)
print(params)

这行显示错误,因为我猜data=params 的格式不正确。

有没有办法将 urlencoded 参数发布到 API?

【问题讨论】:

  • 只需将 dict 传递给data,默认情况下,请求将负责将其作为 x-www-form-urlencoded 发送。

标签: python api heroku flask urlencode


【解决方案1】:

您不需要显式编码,只需传递一个字典。

>>> r = requests.post(URL, data = {'key':'value'})

来自documentation:

通常,您希望发送一些表单编码的数据——很像 HTML 形式。为此,只需将字典传递给 data 参数。您的 数据字典将在请求时自动进行表单编码 制作完成

【讨论】:

    【解决方案2】:

    Content-Type 标头设置为application/x-www-form-urlencoded

    headers = {'Content-Type': 'application/x-www-form-urlencoded'}
    r = requests.post(URL, data=params, headers=headers)
    

    【讨论】:

      【解决方案3】:

      需要注意的重要一点是,对于嵌套的 json 数据,您需要将嵌套的 json 对象转换为字符串。

      data = { 'key1': 'value',
               'key2': {
                      'nested_key1': 'nested_value1',
                      'nested_key2': 123
               }
      
             }
      

      字典需要转换成这种格式

      inner_dictionary = {
                      'nested_key1': 'nested_value1',
                      'nested_key2': 123
               }
      
      
      data = { 'key1': 'value',
               'key2': json.dumps(inner_dictionary)
      
             }
      
      r = requests.post(URL, data = data)
      

      【讨论】:

      • 这拯救了我的一天。我应该更多地关注我的curl 请求,该请求运行良好,但由于这个原因requests 不是。我尝试了json.dumps(data) 并发现它也不起作用,并且requests 自动对请求正文进行了编码。关键是requests只对请求体的顶层进行了编码。
      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 2013-01-11
      • 2023-03-05
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      相关资源
      最近更新 更多