python requests库翻译(二)

来源:互联网 发布:网络割接的原则 编辑:程序博客网 时间:2024/06/05 03:32

这篇是继续上一篇

七.自定义headers

如果你想发送一个带头(header)的请求,只需要传入一个字典类型的headers参数就可以了

下面的例子中加一个用户里代理参数在头文件中:

>>> url = 'https://api.github.com/some/endpoint'

>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r=requests.get(url, headers=headers)

>>> print r.json()

{u'documentation_url': u'https://developer.github.com/v3', u'message': u'Not Found'}

ps:头文件还是特别重要的,之前公司接口增加安全功能,所有的接口都需要增加身份验证即cookies,就是都需要从login接口获取cookies,并在后面请求接口中在headers中传入cookies用于校验身份。

注意:

1.如果证书在指定的.netrc的文件中,授权头文件中headers将会被复写,将会被auth=parameter复写。

2.如果可以获取的指定的host文件,授权的headers将被移除。

3.如果url中有包含代理证书将会复写代理授权的headers

4.当我们指定了内容的长度,content-length的headers将被复写

备注:第2点表示如果指定host文件就会访问指定的服务器,第4点content-length在request的header中有对应key,可以抓包看一下。第1和3点我也没有用到过,用到了在补充吧.

八.更复杂的post请求
通常,如果你想发送表单编码的数据-就像HTML表单的数据,你只需要向参数data中传入字典格式数据即可,当发送请求时data数据将会被自动编码,例如:

>>> payload = {'key1': 'value1', 'key2': 'value2'}

>>> r = requests.post("http://httpbin.org/post", data=payload)

>>> print "r.text:",r.text

通过".text"属性,显示response的返回内容,
但是很多时候,你发送的数据可能不需要编码,这个时候只需要传入一个字符串而不是字典,就可以直接发送。
下面这个例子就是用json.dumps()这个编码后传入:

>>> import json

>>> url = 'https://api.github.com/some/endpoint'

>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))

>>> print r.json()

当然你也可以不自己编码,直接传入json格式的参数,requests将会自动为你编码,比如:

>>> url = 'https://api.github.com/some/endpoint'

>>> payload = {'some': 'data'}

>>> r = requests.post(url, json=payload)

>>> r.json()

备注:这两个例子本质区别到底是调用了post()方法中的默认参数data还是json,具体我把post请求参数备注截图下面供大家参考




里面写的很清楚参数data需要数据类型是字典,参数json需要json类型数据。这个我觉得在数据类型很简单的时候比如说典型{key:value}的时候当然都一样,但是当传入参数比较复杂的时候建议使用json.dumps()进行json编码,因为我之前需要数据类型过去复杂造成接口一直返回参数错误,和rd调了好久发现编码后就好了,虽然目前不知道具体原因但还是建议使用编码吧。
九.传入一个多重编码文件
requests支持简单文件上传
这个目前公司APP接口没有用到,我就把官方文档例子可以上传的文件类型整合一起,列在下面,什么时候需要用,什么时候尝试一下。

>>> url = 'http://httpbin.org/post'

>>> files1 = {'file': open('report.xls', 'rb')}

>>> files2 = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> files3 = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} 

>>> r=requests.post(url=url,files=file*)

备注:我理解就是可以支持xls和csv格式的文件,没有试过,不知道会不会有啥坑。。。。

如果想要上传超大的文件,requests是不支持的,需要单独的包requests-toolbelt,需要可以查看toolbelt官方文档。

警告:
强烈建议使用二进制格式打开文件,这是因为Requests有可能会因为headers中key,content-length的value可能会限制文件中字节数,造成在文本格式下打开后报错。


上面就是requests-请求部分内容,下一篇写response。



原创粉丝点击