详解Python requests中Post请求Form Data与Request Payload的区别
本文深入解析Python requests库中Post请求的两种主要参数形式:Form Data与Request Payload。通过Chrome开发者工具示例,详细对比了application/x-www-form-urlencoded与application/json两种Content-Type下的数据提交方式,并提供了对应的requests.get与requests.post代码实现,帮助开发者解决因参数格式错误导致的数据获取失败问题。
在近期爬取特定网站时,遇到一个现象:即使Post请求的参数构造正确,也无法获取到预期数据。为排查问题,尝试将Post参数进行urlencode编码后拼接至URL末尾,转换为Get请求,结果成功获取数据。这一反常现象引发了对Post请求参数构造机制的深入探究。
1. HTTP请求中Form Data与Request Payload的区别:
在Ajax Post请求中,常见的两种参数传递形式分别为Form Data和Request Payload。
Get请求时,参数直接体现于URL中,格式为key1=value1&key2=value2。而Post请求中,表单参数位于请求体(Request Body)内,同样以key1=value1&key2=value2的形式存在。通过Chrome浏览器的开发者工具,可以直观观察到这一区别。
a. Form Data类型:
针对Form Data类型的Post请求,有两种处理方式。第一种是将该Post请求转换为Get请求,即将请求参数通过"?key1=value1&key2=value2"拼接在URL之后,然后以Get方式发起请求:response = requests.get(url,headers=headers),其中url为拼接后的完整URL。
第二种方式是保持使用Post请求,将参数放置于data字段中:response = requests.post(url,headers=headers,data=data),其中url为原始的Post URL。

注意上图中红圈标注的内容,此时请求头中的Content-Type为application/x-www-form-urlencoded。点击Form Data旁边的view source,可以看到数据变为key1=value1&key2=value2的形式,如下图所示。此时,你可以将这部分内容追加到Post的Request URL后面,将其转化为Get请求,从而成功获取数据。

b. Request Payload类型

同样在Chrome浏览器开发者工具中,可以观察到两者的不同之处。此时Content-Type为application/json,表明需要传递的是一个JSON类型的对象。点击view source,如下图所示。

数据自动转换为JSON格式。此时必须发送Post请求,并将该JSON对象传入方可获取数据。示例代码如下:
response = requests.post(url,json=data,headers=headers) 与普通Post请求相比,此处的Post参数中的data必须进行序列化(serialization)处理。
参考:https://stackoverflow.com/questions/10494574/what-is-the-difference-between-form-data-and-request-payload
到此为止,关于Python requests中Post请求参数问题的详解介绍完毕。更多相关Python requests Post请求参数内容,请搜索本站往期文章或继续浏览后续相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













