事情的起因是:有一个创建日程的接口,创建人和参与人,都需要websocket推送一条日程更新信息;现在要测试这个推送名单是否正确,所以要用python写一个创建日程的post请求,指定参与者,即下面代码中的attendees。

开始写好代码的时候,没有添加参与人,即 "attendees": [],跑下来没毛病,日程创建成功!

于是,接下来就添加了参与人,准备做最后一件事情,校验ws收到消息的名单是否和参与人一致;attendees参数如下:

"attendees": [{"cp_id": 154}, {"cp_id": 454}, {"cp_id": 356}]

问题来了!报错了!!!

content: {'code': 40099, 'msg': 'Invalid argument supplied for foreach()(0)', 'data': []}

只是添加上了attendees的值而已,刚才还能请求成功呢?

参数格式也是对的啊,把body拷贝到Apifox发送,日程是能创建成功的...... 于是我,除了傻眼只有迷茫好吗!先贴上代码:

def create_schedule(instance_id, cp_id):url = "http://cpapi.st1.2345.cn/widget/calendar_b/instances/%s/createSchedule?tdusername=&tdcpid=%s" % (instance_id, cp_id)body = {"summary": "test","start_date": "2020-12-16 09:00","end_date": "2020-12-17 10:00","location": "","repeat_type": -1,"remind_before_event_secs": 900,"attendees": [{"cp_id": 154}, {"cp_id": 454}, {"cp_id": 356}],"origin_start_date": "2020-12-16 09:00:00","description": ""}response = requests.post(url,data=body)content = response.json()print("content:", content)if content['code'] == 0 and content['msg'] == 'success':print("日程创建成功,body:", body)if __name__ == '__main__':create_schedule(11, 22)

找报错原因,猜测是不是attendees结构复杂,是字典里面嵌套列表又嵌套字典,于是搜索python的post请求body嵌套列表报错,还真找到一个和我这个body结构一毛一样的,开心!

该博主的解决方式是,把整个列表json.dumps()处理下:

修改下attendees:

"attendees": [{"cp_id": 154}, {"cp_id": 454}, {"cp_id": 356}]

运行,还是报错?!!

content: {'code': 40099, 'msg': 'Invalid argument supplied for foreach()(0)', 'data': []}

那会不会是整个body格式都不对,恢复attendees把post请求里的body参数dumps一下:

response = requests.post(url,data=json.dumps(body))

还是报错,不过报错变了:

content: {'code': 56001, 'msg': '开始时间不能为空', 'data': []}

'开始时间不能为空' 这个报错,是start_date没有传或者start_date为空时提示,而我传的start_date是有值的,说明这个格式转换行不通。

而且我一直耿在attendees为空列表的时候是可以请求成功的,所以我觉得其他内容肯定是没问题的,问题就出在了attendees这个参数值上,感觉是代码处理这个参数的时候没取到值。全部改回去,打印看下请求的body值,打印结果如下:

summary=test&start_date=2020-12-16+09%3A00&end_date=2020-12-17+10%3A00&location=&repeat_type=-1&remind_before_event_secs=900&attendees=cp_id&attendees=cp_id&attendees=cp_id&origin_start_date=2020-12-16+09%3A00%3A00&description=

我cp_id的值呢?于是更坚信了是这个参数导致的请求失败。。。。(后面知道这个参数是无辜的,所以提醒我们,找问题思维要发散...)

中间略去各种找攻略找解决办法,因为结果都是,没解决!!!

感觉没想法了,代码怎么看都没毛病,只好去看看apifox的请求,跟我代码请求到底哪里不一样,我全抄上行吧!

apifox发送好请求只好,requests信息如下:

请求 URL:

POSThttp://cpapi.st1.2345.cn/widget/calendar_b/instances/6593/createSchedule?tdusername=&tdcpid=183

Headers:

名称
Authorization 【删掉了】
User-Agent apifox/1.0.24 (https://www.apifox.cn)
Content-Type application/json
Accept */*
Cache-Control no-cache
Host cpapi.st1.2345.cn
Accept-Encoding gzip, deflate, br
Connection keep-alive
Content-Length 317

Body:

Body 类型:application/json

{"summary": "test","start_date": "2020-12-16 09:00","end_date": "2020-12-17 10:00","location": "","repeat_type": -1,"remind_before_event_secs": 900,"attendees": [{"cp_id": 154}, {"cp_id": 454}, {"cp_id": 356}],"origin_start_date": "2020-12-16 09:00:00","description": ""
}

嗯,headers参数好多哦,可是身份认证也不是用的Authorization(因为是debug模式),其他参数好像也没啥特别的,

主要是没加参与人的时候也没headers,请求没毛病啊!

这里的body的类型提示是 application/json,难道代码请求的body参数被默认成了别的类型?!加个打印,看下headers信息

print(content, response.request.headers, response.request.body)

打印出来这样,看第二行:

{'code': 40099, 'msg': 'Invalid argument supplied for foreach()(0)', 'data': []}

{'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '227', 'Content-Type': 'application/x-www-form-urlencoded'} summary=test&start_date=2020-12-16+09%3A00&end_date=2020-12-17+10%3A00&location=&repeat_type=-1&remind_before_event_secs=900&attendees=cp_id&attendees=cp_id&attendees=cp_id&origin_start_date=2020-12-16+09%3A00%3A00&description=

额,还真是,content_type 是 application/x-www-form-urlencoded,可能就是这个原因导致body参数解析异常!赶紧加下headers,加完headers,记得此时body参数要转化为json:

def create_schedule(instance_id, cp_id):url = "http://cpapi.st1.2345.cn/widget/calendar_b/instances/%s/createSchedule?tdusername=&tdcpid=%s" % (instance_id, cp_id)body = {"summary": "test","start_date": "2020-12-16 09:00","end_date": "2020-12-17 10:00","location": "","repeat_type": -1,"remind_before_event_secs": 900,"attendees": [{"cp_id": 154}, {"cp_id": 454}, {"cp_id": 356}],"origin_start_date": "2020-12-16 09:00:00","description": ""}headers = {"Content-Type": "application/json"}response = requests.post(url, headers=headers, data=json.dumps(body))content = response.json()if content['code'] == 0 and content['msg'] == 'success':print("日程创建成功,body:", body)if __name__ == '__main__':create_schedule(6593, 183)

执行成功了!

D:\Python37\python.exe E:/8.pyProject/test/1.py
content: {'code': 0, 'msg': 'success', 'data': {'schedule_id': 2212}}
日程创建成功,body: {'summary': 'test', 'start_date': '2020-12-16 09:00', 'end_date': '2020-12-17 10:00', 'location': '', 'repeat_type': -1, 'remind_before_event_secs': 900, 'attendees': [{'cp_id': 154}, {'cp_id': 454}, {'cp_id': 356}], 'origin_start_date': '2020-12-16 09:00:00', 'description': ''}

Process finished with exit code 0

【结论】

这是一场headers引发的xue案,费了我不少时间排查问题,而且没有头绪,瞎撞上改好了;

还是因为对http请求了解不够,学习还得再接再厉,不然BUG都找不出来~~~~

python post请求传body参数,报参数错误解决方案——菜鸟的笨拙排雷之路相关推荐

  1. git push origin master上传资源总是报密码错误,但是密码确实是正确的应该怎么办?

    问题解决: 对Git的版本进行更新,之后再重新启动输入命令即可解决: ①输入命令:git update-git-for-windows,对git进行更新. ②更新git的操作如下: ③成功上传资源界面 ...

  2. Linux 部署ftp报530 错误解决方案

    Linux 部署ftp报530 错误解决方案 参考文章: (1)Linux 部署ftp报530 错误解决方案 (2)https://www.cnblogs.com/austinspark-jessyl ...

  3. 帆软报表跨域请求头带自定义属性报403错误

    当我们在插件中开发的请求需要给其他系统试用的时候就涉及到跨域,如果我们调用插件中的方法时,需要在请求头上带自定义属性的时候,此时JSONP方案部可行,所以采用CROS方案,由于CROS方案如果请求头带 ...

  4. java post请求返回500错误_Ajax请求Json数据,报500错误,后台没有错误日志。

    post请求:http://localhost:9080/DataDiscoveryWeb/issueformcount/queryIssueTendencyDetail.xhtml?jobId=86 ...

  5. Spring上传时报Invalid CSRF Token错误解决方案

    概述 使用spring security之后,默认上传文件会报这个错,解决方案有下面两个: 解决方案一: 将 MultipartFilter 放在 springSecurityFilterChain ...

  6. 幼儿园EasyNVR能力层安防监控平台调用视频直播流报404错误解决方案

    现在很多幼儿园都在使用安防摄像头做监控,并且会搭建专有的流媒体平台做安防直播或录像.我们的视频流媒体服务器EasyNVR也有过不少幼儿园监控直播的项目案例,我们不仅支持视频流的在线直播,也支持视频流的 ...

  7. Tomcat 访问Manager APP报403错误解决方案

    Tomcat 访问Manager APP报403 解决方案(虚拟机可以正常使用,外网访问报错),虚拟机中Tomcat启动后,可以访问项目(虚拟机里面和外面都可以).虚拟机中能够正常进入manager ...

  8. easyui 传递参数报错(错误:uncaught SyntaxError: Unexpected identifier)

    转自:https://www.cnblogs.com/javaboy2018/p/8733585.html 代码: 按钮事件: function formatOper(val, row, index) ...

  9. HipChat上传文件报未知错误解决方案

    前言 HipChat是Atlassian公司的一款团队协作即时通讯工具,服务端为Linux(官方给的服务端就是一个虚拟机),在Windows.Linux.Android.IOS.Mac等平台都有客户端 ...

最新文章

  1. 神经网络设计与分析之如何知道权重的利用率
  2. 【Python】超全的 100 个 Pandas 函数汇总,建议收藏
  3. Socket.io发送消息含义
  4. 这样的递归调用,你看出来了?
  5. 祝贺 在线文件管理系统 访问量 超过500
  6. adb——Android的ADB工具使用
  7. 没用过这几招,别说你会使用Jupyter Notebook
  8. web安全day2:NTFS安全权限
  9. SpringBoot Maven repackage failed: Unable to find a single main class from the following candidates
  10. Java字符流拷贝/复制文本文件,字节流拷贝文本文件乱码,很经典简便
  11. matlab保留有效数字指数形式,Matlab中数值计算精度
  12. 关于RTSP在HTML5前端播放问题解决办法
  13. ansys19.0安装破解教程(图文详解)
  14. 柴静《看见》摘抄及小评
  15. TLS版本及CipherSuites确认及设置
  16. 经过负载均衡图片加载不出来_负载均衡基础知识
  17. 一些程序员的找工作常见的面试问题
  18. Ajax创建步骤内含兼容
  19. inner join和outer join的区别
  20. UI 设计代码化:低代码式设计语言 —— Unflow

热门文章

  1. Elasticsearch: Query string与Simple query string
  2. 经典文献阅读之--SuMa++
  3. poj 2480 python_python-pptx:是一个python处理ppt的库
  4. Arcgis Server 发布服务报错Failed to start the server machine ‘XXX‘. Error while starting AppServer. Requir
  5. Phython做小鸟飞行游戏
  6. java文本区背景颜色_Java如何设置PDF文档背景色详解|chu
  7. 用计算机语言编写花瓣雨,花瓣雨【石家庄计算机学院吧】_百度贴吧
  8. angular中forRootforChild的作用
  9. python中文分词,生成标签云,生成指定形状图片标签云
  10. Mac AndroidStudio .9图片制作