V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sadddhu
V2EX  ›  程序员

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

  •  
  •   sadddhu · 2018-09-03 11:43:15 +08:00 · 4931 次点击
    这是一个创建于 2070 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    8 条回复    2018-09-04 11:47:55 +08:00
    lolizeppelin
        1
    lolizeppelin  
       2018-09-03 11:59:54 +08:00 via Android
    抓包看区别啊
    danielmiao
        2
    danielmiao  
       2018-09-03 18:42:56 +08:00
    UA
    LukeChien
        3
    LukeChien  
       2018-09-03 19:10:50 +08:00 via Android
    把请求发给 httpbin.org 看看区别
    sadddhu
        4
    sadddhu  
    OP
       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
        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 的时候出现了错误,你可以看看它构建的是什么
    WizardMeow
        6
    WizardMeow  
       2018-09-03 22:56:22 +08:00
    也不能说是错误,它是严格遵守标准的……错误的是那边服务器非标……
    lolizeppelin
        7
    lolizeppelin  
       2018-09-04 00:11:11 +08:00 via Android
    有字典无序 标准是无序但是服务端不一定按照无序解析


    无序最坑的是加密 的时候 这种时候要用有序字典
    sadddhu
        8
    sadddhu  
    OP
       2018-09-04 11:47:55 +08:00
    @WizardMeow 感谢.
    根本原因找到了. 我在使用上述我提到的第二种方式的时候, 其中有个参数我已经做了 url encode, 但 requests 对已经 encode 的内容再次 encode, 导致了构造的 url 不一样.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   766 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:51 · PVG 04:51 · LAX 13:51 · JFK 16:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.