当前位置: 首页 > news >正文

python requests.post请求404问题

问题场景

有时候,在编写一段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)

运行结果为
在这里插入图片描述

问题分析

既然404,那就排查问题,data和header都是直接从复制浏览器中复制过来的,不会有问题,那有问题的必然是request.post中的方法问题
查看request.post源码
在这里插入图片描述
从源码中可以看到,request.post可以接受两个参数,一个是data,还有一个是json,
data是以字典的形式发送body,json则是以json数据格式发送body
通过这两个注释可以很明显的发现,requests.post在发送请求时,会根据当前传递的参数来选择不同的方式,可以理解为一种是表单形式,还有一种是json格式

postman测试

通过postman来测试两种不同请求下的情况
form表单
在这里插入图片描述

Json数据
在这里插入图片描述

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

问题解决

将原先代码中data替换成json

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

在这里插入图片描述

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

结论

  1. 当request.post使用json来传递参数时,即使不指定content-type类型,也会默认指定application/json
    在这里插入图片描述
  2. 使用data传递参数时,将会以表单的形式进行提交,并且后续将通过urlencode转换成字符串,及key1=value1&key2=value2的形式
    在这里插入图片描述
  3. 使用data时,即使指定了content-type也不会生效,后续将会被默认替换掉
    在这里插入图片描述
    因此,需要根据自己实际情况来分析当前接口接收数据时使用的是什么格式,但目前一般的网站都开始采用application/jsond的数据格式

相关文章:

  • Vue中如何使用Eachers
  • jvm VisualVM工具的使用:使用jvisualvm监控远程tomcat jvm进程
  • git commit后,如何撤销commit
  • SS-Model【3】:DeepLabv2
  • 基于springboot高校社团管理系统
  • 在线教育项目【老师服务】
  • 堆的应用:堆排序及TopK问题
  • 【Android development】系列_01创建安卓应用程序
  • Keras CIFAR-10图像分类 GoogleNet 篇
  • 详解react生命周期和在父子组件中的执行顺序
  • 2022年山东省安全员C证复训题库模拟考试平台操作
  • 《算法导论》第11章-散列表 11.1-直接寻址表 11.2 散列表
  • 归并排序算法
  • DNSPod十问百果园焦岳:为什么开水果店是一门高科技生意?
  • 《nginx》三、nginx负载均衡
  • 【剑指offer】让抽象问题具体化
  • css布局,左右固定中间自适应实现
  • ES6系统学习----从Apollo Client看解构赋值
  • Git的一些常用操作
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • linux安装openssl、swoole等扩展的具体步骤
  • maven工程打包jar以及java jar命令的classpath使用
  • Otto开发初探——微服务依赖管理新利器
  • Python进阶细节
  • SQLServer插入数据
  • Swift 中的尾递归和蹦床
  • TypeScript迭代器
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 官方解决所有 npm 全局安装权限问题
  • 近期前端发展计划
  • 软件开发学习的5大技巧,你知道吗?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 无服务器化是企业 IT 架构的未来吗?
  • 应用生命周期终极 DevOps 工具包
  • (003)SlickEdit Unity的补全
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Java)【深基9.例1】选举学生会
  • (MATLAB)第五章-矩阵运算
  • (Note)C++中的继承方式
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (八)Flask之app.route装饰器函数的参数
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)鸿鹄云架构一服务注册中心
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (五)MySQL的备份及恢复
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *2 echo、printf、mkdir命令的应用