论如何实现multipart/form-data类型的post请

作者: 极致简洁 | 来源:发表于2017-12-11 11:04 被阅读199次

    近日,友人发来一链接,说页面请求分析过程中碰到一个奇怪的post请求,于是乎,好奇心旺盛的博主也立马上手研究起来。
    报文截图如下,不知各位看官是否遇见过这样的请求体。


    Payload截图

    好了,报文有了,那么我们就开始分析这其中的原理,并最终实现模拟功能。
    首先,报文中多次出现webkitFormBoundary这个关键字,我猜测这肯定是某种函数或者软件自动生成的结果。
    与此同时,我们也必须研究下请求头,截图如下


    请求头

    如图中标红部分,一个是multipart/from-data,一个是boundary,在看到后者的瞬间,博主心中大喊“原来如此!”
    ok,payload的组成一定与content-Type有关,借助谷歌,博主自我科普了一把multipart/form-data的概念。
    诸位有兴趣的可以看下方链接,

    http://www.jianshu.com/p/e810d1799384
    https://stackoverflow.com/questions/3508338/what-is-the-boundary-in-multipart-form-data
    http://docs.python-requests.org/en/master/user/quickstart/#post-a-multipart-encoded-file
    https://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python/12385661#12385661
    

    好了,原生的requests对这类请求支持不是很好,根据官方文档,我们需要使用requests-toolbelt 这个库,详细的介绍大家可以搜索这个帮助文档。
    具体代码如下:

    import requests
    from requests_toolbelt  import MultipartEncoder
    headers={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding':'gzip, deflate',
        'Accept-Language':'zh-CN,zh;q=0.9',
        'Connection':'keep-alive',
        'Host':'sydwjg.sdbb.gov.cn',
        'Content-Type':'',
        'Content-Length':'907',
        'Referer':'',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
    }
    file_payload = {'xydm':'',
            'confirm_before_do':'查询'
    }
    m = MultipartEncoder(file_payload)
    headers['Content-Type'] = m.content_type
    url_origin = '目标网址'
    resp = requests.post(url_origin,headers=headers,data=m,timeout=10)
    print(resp.status_code)
    

    不过话说回来,现在很少有网站用到这种请求,或者我猜测文件上传用到这种方式比较多。。
    anyway,新技能点get!

    相关文章

      网友评论

      • 小七奇奇:你好,用你这种方法boundary里面的值是随机生成的,而图片上是WebKit开头的,如何更改呢,我自己定义headers['Content-Type']的值,还是无法更改

      本文标题:论如何实现multipart/form-data类型的post请

      本文链接:https://www.haomeiwen.com/subject/kzveixtx.html