python requests.post请求404问题及解决方法

作者:李飞飞_None 时间:2022-08-16 09:36:23 

问题场景

有时候,在编写一段http接口请求程序时,发现代码中的header头和请求体中都是原网页中一样,但是,在实际请求时,接口却返回404,代码如下

header = {
   # ':authority': 'm.ctrip.com',
   # ':method': 'POST',
   # ':path': '/restapi/soa2/20405/getPCSightList',
   # ':scheme': 'https',
   'accept': '*/*',
   'accept-encoding': 'gzip, deflate, br',
   'accept-language': 'zh-CN,zh;q=0.9',
   'authorization': 'xx',
   'cache-control': "no-cache",
   'content-length': '373',
   'content-type': 'application/json;charset:utf-8;',
   'cookies': 'xx',
   'origin': 'https://www.tripadvisor.cn',
   'pragma': 'no-cache',
   'referer': 'https://www.tripadvisor.cn/Attractions-g60763-New_York_City_New_York-Vacations.html',
   'sec-ch-ua': "'.Not/A)Brand';v='99', 'Google Chrome';v='103', 'Chromium';v='103'",
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': 'macOS',
   'sec-fetch-dest': 'empty',
   'sec-fetch-mode': 'cors',
   'sec-fetch-site': 'cross-site',
   'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
   'x-ta-uid': 'cd58b674-7dba-484a-a908-3239120cd728'
}
url = 'https://m.ctrip.com/restapi/soa2/20405/getPCSightList'
data = {"geoId":60763,"pageIndex":1,"pageSize":30,"travelRanking":"false","needSelectedFilters":"true","filters":[{"type":"subcategory","param":""},{"type":"subtype","param":""},{"type":"neighborhood","param":""},{"type":"travelerRating","param":""},{"type":"awards","param":""},{"type":"waypointairport","param":""},{"type":"waypointstation","param":""},{"type":"other","param":""}]}
response = requests.post(url=url, data=data, headers=header)
print(response.status_code)

运行结果为

python requests.post请求404问题及解决方法

问题分析

既然404,那就排查问题,data和header都是直接从复制浏览器中复制过来的,不会有问题,那有问题的必然是request.post中的方法问题
查看request.post源码

python requests.post请求404问题及解决方法

从源码中可以看到,request.post可以接受两个参数,一个是data,还有一个是json,
data是以字典的形式发送body,json则是以json数据格式发送body
通过这两个注释可以很明显的发现,requests.post在发送请求时,会根据当前传递的参数来选择不同的方式,可以理解为一种是表单形式,还有一种是json格式

postman测试

通过postman来测试两种不同请求下的情况
form表单

python requests.post请求404问题及解决方法

Json数据

python requests.post请求404问题及解决方法

通过postman测试可以发现,当前服务后端接口仅接受json格式的数据,即content-type为application.json

问题解决

将原先代码中data替换成json

response = requests.post(url=url, json=data, headers=JsonHeader)

python requests.post请求404问题及解决方法

这个时候肯定有人会问,那我使用data传递数据时,将header头中的content-type指定为application/json不就行了,但其实是不行的,就算自己指定了,最后request.body的值也是类似于key1=value1&key2=value2这种形式

结论

当request.post使用json来传递参数时,即使不指定content-type类型,也会默认指定application/json

python requests.post请求404问题及解决方法

使用data传递参数时,将会以表单的形式进行提交,并且后续将通过urlencode转换成字符串,及key1=value1&key2=value2的形式

python requests.post请求404问题及解决方法

使用data时,即使指定了content-type也不会生效,后续将会被默认替换掉

python requests.post请求404问题及解决方法

因此,需要根据自己实际情况来分析当前接口接收数据时使用的是什么格式,但目前一般的网站都开始采用application/jsond的数据格式

来源:https://blog.csdn.net/qq_42293758/article/details/126678905

标签:python,requests.post,请求
0
投稿

猜你喜欢

  • 从Web查询数据库之PHP与MySQL篇

    2023-07-18 11:04:05
  • 在IE下用getAttribute时要小心

    2008-08-21 12:54:00
  • IE7兼容模式与兼容视图

    2010-06-28 18:48:00
  • 打造“前端开发”程序员专用版EditPlus

    2009-01-05 13:04:00
  • Python光学仿真教程实现光线追踪

    2023-08-12 00:27:39
  • asp如何在网上查找链接?

    2010-06-22 21:10:00
  • Golang的关键字defer的使用方法

    2023-07-12 21:10:49
  • Python浅析生成器generator的使用

    2023-09-02 16:58:40
  • 分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)

    2023-11-17 02:40:14
  • Mootools 1.2教程(9)——输入过滤第二部分(字符串)

    2008-12-01 12:25:00
  • MySQL Basis 常用命令

    2010-11-11 11:59:00
  • 微软建议的ASP性能优化28条守则(1)

    2008-02-22 16:54:00
  • 适宜做简单搜索的MySQL数据库全文索引

    2009-01-04 13:11:00
  • div中class与id的区别及应用

    2007-09-22 08:37:00
  • 使用python搭建Django应用程序步骤及版本冲突问题解决

    2023-01-29 07:36:34
  • IE地址栏显示网站图标制作方法

    2007-10-13 11:08:00
  • Pycharm 2020年最新激活码(亲测有效)

    2023-07-24 00:42:14
  • python re.match()用法相关示例

    2023-07-21 05:12:30
  • 将不规则的Python多维数组拉平到一维的方法实现

    2023-11-05 19:47:15
  • 提供效率的几个ASP编程技巧

    2010-05-03 11:11:00
  • asp之家 网络编程 m.aspxhome.com