请求被服务器识别为非法请求, 但使用 postman/curl 可以正常通过

2018-09-03 11:43:15 +08:00
 sadddhu

背景: 有一个接口通过 postman/curl 测试正常.

问题: 但我用 python 的 requests 库构造了一个 GET 请求, 请求的 headers 完全和 postman 发出的一样, 但是被服务器识别为非法请求(返回的 http status 为 200, body 的错误描述为非法请求). 1. 它是怎么知道这个请求不是来自于浏览器 /postman/curl 的? 2. postman/curl 是否做了些其他我不知道的逻辑或添加了我不知道的请求参数吗?

4971 次点击
所在节点    程序员
8 条回复
lolizeppelin
2018-09-03 11:59:54 +08:00
抓包看区别啊
danielmiao
2018-09-03 18:42:56 +08:00
UA
LukeChien
2018-09-03 19:10:50 +08:00
把请求发给 httpbin.org 看看区别
sadddhu
2018-09-03 20:37:13 +08:00
@lolizeppelin 问题已经解决了.
requests.get('http://example.com?A=1&B=2') 和 requests.get('http://example.com, params={'A': 1, 'B': 2})有区别吗?
WizardMeow
2018-09-03 22:55:34 +08:00
@sadddhu 有。[相关源码]( https://github.com/requests/requests/blob/master/requests/models.py#L350-L434)
坑一定在编码和一些非标准字符,构建 URL 的时候出现了错误,你可以看看它构建的是什么
WizardMeow
2018-09-03 22:56:22 +08:00
也不能说是错误,它是严格遵守标准的……错误的是那边服务器非标……
lolizeppelin
2018-09-04 00:11:11 +08:00
有字典无序 标准是无序但是服务端不一定按照无序解析


无序最坑的是加密 的时候 这种时候要用有序字典
sadddhu
2018-09-04 11:47:55 +08:00
@WizardMeow 感谢.
根本原因找到了. 我在使用上述我提到的第二种方式的时候, 其中有个参数我已经做了 url encode, 但 requests 对已经 encode 的内容再次 encode, 导致了构造的 url 不一样.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/485578

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX