requests--传递参数
传递参数
传递URL参数
data = {'city': '北京'} # 参数有中文如果发送不了,必须要编码 city = parse.urlencode(data).encode('utf-8')
一般在GET请求中使用查询字符串(query string)来进行参数传递,在requests库中使用如下方法:
import requests base_url = 'http://httpbin.org' # 将参数存在字典里 params_data = {"user": "zou", "pwd": '31500'} r = requests.get(base_url + '/get', params=params_data) print(r.url) # 打印URL print(r.status_code)
结果
http://httpbin.org/get?user=zou&pwd=31500 200
传递body参数
在post请求里有两个参数,data为form表单格式的,json为Content-Type是json格式的。返回的值如果是json格式的,可以用r.json(),r.text不管是json格式还是html格式的都可以
在POST请求中,一般参数都在请求体中传递,在requests中用法如下:
import requests base_url = 'http://httpbin.org' # 将参数存在字典里 form_data = {"user": "zou", "pwd": '31500'} r = requests.post(base_url + '/post', data=form_data) print(r.url) # 打印URL print(r.status_code) print(r.text) # 打印出响应文本
结果:
http://httpbin.org/post 200 { "args": {}, "data": "", "files": {}, "form": { "pwd": "31500", "user": "zou" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "18", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "112.10.81.210, 112.10.81.210", "url": "https://httpbin.org/post" }
data和json的区别
如果我们发送post请求时,里面有个参数json,还有个参数时data,它们都是提交的服务器的数据,那它们有什么区别呢?
data与json既可以是str,也可以是dict
区别如下:
不管json是str还是dict,如果不指定headers中的content-type,默认为application/json
data为dict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式,此时数据可以从request.POST里面获取,而request.body的内容则为a=1&b=2的这种形式,注意,即使指定content-type=application/json,request.body的值也是类似于a=1&b=2,所以并不能用json.loads(request.body.decode())得到想要的值
data为str时,如果不指定content-type,默认为application/json
原始响应内容
可以找出 Requests 使用了什么编码,并且能够使用r.encoding 属性来改变它:
r.encoding # 获取编码格式 'utf-8'
r.encoding = 'ISO-8859-1' # 设置编码格式
在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True。具体你可以这么做:
>>> r = requests.get('https://api.github.com/events', stream=True) >>> r.raw <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10) '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'
如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),我们可以通过Response.raise_for_status() 来抛出异常:
>>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)