当前位置: 首页 > 面试题库 >

Python请求模块发送JSON字符串而不是x-www-form-urlencoded参数字符串

郭意
2023-03-14
问题内容

我的印象是,使用x-www-form-urlencoded规范的POSTS应该在帖子正文中发送URL编码的参数字符串。但是,当我这样做时

data = json.dumps({'param1': 'value1', 'param2': 'value2'})
Requests.post(url, data=data)

接收端的请求主体如下所示:

{"param1": "value1", "param2": "value2"}

但我期望得到这个

param1=value1&param2=value2

我如何获得请求以第二种形式发送数据?


问题答案:

获得JSON的原因是因为您显式调用json.dumps以生成JSON字符串。只是不这样做,您就不会得到JSON字符串。换句话说,将第一行更改为:

data = {'param1': 'value1', 'param2': 'value2'}

正如文档所解释的,如果将dict作为data值传递,它将以形式编码,而如果传递字符串,则将按原样发送。

例如,在一个终端窗口中:

$ nc -kl 8765

在另一个:

$ python3
>>> import requests
>>> d = {'spam': 20, 'eggs': 3}
>>> requests.post("http://localhost:8765", data=d)
^C
>>> import json
>>> j = json.dumps(d)
>>> requests.post("http://localhost:8765", data=j)
^C

在第一个终端中,您将看到第一个请求主体是this(和Content-Type application/x-www-form-urlencoded):

spam=20&eggs=3

…而第二个是这个(并且没有Content-Type):

{"spam": 20, "eggs": 3}


 类似资料:
  • 我有一个Jersey 2.22 rest web服务,我的一个endpoint有以下签名: 我使用PostMan调用这个web服务,在post请求中不传递任何特定的头,我将“query”form param传递为“x-www-form-urlencoded”。 jersey应用程序由Tomcat 7托管,该Tomcat 7以JVM编码UTF-8文件启动。编码UTF-8,并将连接器的URIEncod

  • 在java中,如何使用。我不明白如何发送带有键值的正文,如上面的屏幕截图所示。 我尝试过以下代码: 但是在回复中,我没有收到正确的数据。

  • 我有一根弦 我需要将其转换为x-www-form-urlencoded格式。 如果我使用在Java中,函数将字符串转换为 但当我以x-www-form-urlencoded的形式从邮递员那里发送请求时,得到的请求是 为什么会有这种差异?我还需要发送请求,因为它在postman中是完全相同的(第二个编码字符串),然后只有我得到了回复。如何将字符串编码为第二种格式?

  • 我在Excel中的VBA宏中使用了以下代码: 在即时窗口中,我收到了以下错误: 400 Apache Tomcat/8.0.28-错误报告1{font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;}H2{font-family:Tahoma,Arial,sans-serif;颜

  • 问题内容: 我有一些要以表单编码形式发布到服务器的参数: 我正在这样发送我的请求(当前没有参数) 如何在请求中包含表单编码的参数? 问题答案: 对于上载表单编码的POST请求,我建议使用FormData对象。 示例代码:

  • 问题内容: 我正在尝试使用Python 3的内置JSON模块进行一些简单的JSON解析,并且从阅读有关SO和谷歌搜索的其他问题来看,这似乎应该非常简单。但是,我想我得到的是返回的字符串,而不是预期的字典。 首先,这是我尝试从中获取值的JSON。这只是Twitter API的一些输出 我将此字符串分配给名为json_string的变量,如下所示: 然后,当我尝试从“杰森”字典中获取特定密钥时: 我收