关于Python的requests库对Form Data请求格式的方式
在公司的时候,需要新增1000多条的促销,促销那边因为是Java组开发的,所以具体怎么回事我们Python组并不知道,测试人员需要加入促销1000多进行压测,所以任务就到了我们Python这边。
打开控制台,我们可以看到它的请求体其实是Form Data格式的,这时,requests库中的参数data,json等请求就会出现异常,异常的报错我这边遇到的就是param未传,
解决的办法也很简单,因为Form Data的请求其实是multipart/form-data 其实是这种格式的,虽然笔者主要做的是自动化开发,但是有关Python的Django框架也熟悉点,知道这种请求格式其实在Django后台的接受方法应该是 request.Files() 的格式,所以猜测是不是请求体应该用files,然后Ctrl B在pycharm里看了一下reqeusts的源码,发现还真有一个参数是files,再看一下reqeusts对它的解释,所以就大胆猜测请求的形参应该就是files。下面呢,是requests对这个files参数的详细介绍,笔者英文六级没过,不敢为大家随意翻译,请大家自己看吧。
Dictionary of ``"name": file-like-objects`` (or ``{"name": file-tuple}``) for multipart encoding upload.
``file-tuple`` can be a 2-tuple ``("filename", fileobj)``, 3-tuple ``("filename", fileobj, "content_type")``
or a 4-tuple ``("filename", fileobj, "content_type", custom_headers)``, where ``"content-type"`` is a string
defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
to add for the file.
为此,参数里面已经告知,请求应为{"name",(...)}的形式,所以我的参数初步定为{"param",(具体需要携带的数据)},但是请求的时候发现还是失败,然后仔细阅读之后,发现落下了一句话:file-tuple
can be a 2-tuple ,那既然我们直接请求是不可以的,我们就才用2元组的形式进行请求,但是参数里面的filename我们没有,那就是用None来代替,所以改成:{"param":(None,"你需要携带的参数")},
果然这样请求的就没有问题了。
import requets uparams = {"param":(None,"""携带的具体参数""")} rep = requests.post(urlupdata, files=uparmas).json() print(rep)