背景: 有一个接口通过 postman/curl 测试正常.
问题: 但我用 python 的 requests 库构造了一个 GET 请求, 请求的 headers 完全和 postman 发出的一样, 但是被服务器识别为非法请求(返回的 http status 为 200, body 的错误描述为非法请求). 1. 它是怎么知道这个请求不是来自于浏览器 /postman/curl 的? 2. postman/curl 是否做了些其他我不知道的逻辑或添加了我不知道的请求参数吗?
1
lolizeppelin 2018-09-03 11:59:54 +08:00 via Android
抓包看区别啊
|
2
danielmiao 2018-09-03 18:42:56 +08:00
UA
|
3
LukeChien 2018-09-03 19:10:50 +08:00 via Android
把请求发给 httpbin.org 看看区别
|
4
sadddhu OP @lolizeppelin 问题已经解决了.
requests.get('http://example.com?A=1&B=2') 和 requests.get('http://example.com, params={'A': 1, 'B': 2})有区别吗? |
5
WizardMeow 2018-09-03 22:55:34 +08:00 1
@sadddhu 有。[相关源码]( https://github.com/requests/requests/blob/master/requests/models.py#L350-L434)
坑一定在编码和一些非标准字符,构建 URL 的时候出现了错误,你可以看看它构建的是什么 |
6
WizardMeow 2018-09-03 22:56:22 +08:00
也不能说是错误,它是严格遵守标准的……错误的是那边服务器非标……
|
7
lolizeppelin 2018-09-04 00:11:11 +08:00 via Android
有字典无序 标准是无序但是服务端不一定按照无序解析
无序最坑的是加密 的时候 这种时候要用有序字典 |
8
sadddhu OP @WizardMeow 感谢.
根本原因找到了. 我在使用上述我提到的第二种方式的时候, 其中有个参数我已经做了 url encode, 但 requests 对已经 encode 的内容再次 encode, 导致了构造的 url 不一样. |