python之requests

发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests
Python3自带的http.client和urllib.request都能发送http请求,不过相对来说使用较麻烦,第三方库requests让发送请求更简单,支持自动编码解码,会话保持,长连等

参考: requests官方文档

requests安装

Windows: 打开cmd命令行,输入pip install requests,等待安装完成即可
Linux: (建议使用Python3),终端中输入pip3 install requests,等待安装完成即可
Mac: (建议使用Python3), sudo python3 -m pip install requests,等待安装完成即可
验证是否安装成功:

打开命令行,输入python,在python shell环境下输入import requests没有报错即安装成功

requests的使用

一个最简单的GET请求
发送一个请求分3步:

组装请求: 请求可能包含url,params(url参数),data(请求数据),headers(请求头),cookies等,最少必须有url
发送请求,获取响应: 支持get,post等各种方法发送,返回的是一个响应对象
解析响应: 输出响应文本
打开Pycharm,新建一个demo项目,项目下新建一个Python文件,输入以下内容:

# 导入requests包
import requests 
url = 'http://cjjl-test.chelun.com/'   # 定义域名
token = 'ba912f94e5a940c3ba417b4d88cc6047'  # 定义token
cid = ''     # 定义cid

# 1. 组装请求
url = url+"NewKingCoach/getActivityStatus"
# 2. 发送请求,获取响应
res = requests.get(url=url) # res即返回的响应对象
# 3. 解析响应
print('res=:' + res.text) # 输出响应的文本

带参数的GET请求

url1 = url+"NewKingCoach/getActivityStatus?_token=token"  # 参数可以写到url里
res1 = requests.get(url=url1)   # url指get方法的参数,url1指上一行我们定义的接口地址
print('res1=:' + res1.text)

url2 = url + "NewKingCoach/getActivityStatus"
params2 = {"_token": token, "cid": cid}  # 字典格式,单独提出来,方便参数的添加修改等操作
res2 = requests.get(url=url2, params=params2)
print('res2=:' + res2.text)

传统表单类POST请求(x-www-form-urlencoded)

url3 = url+"NewKingCoach/checkCoachAttendInfo"
# Post请求发送的数据,字典格式
data3 = {"_token": token, "cid": cid}
res3 = requests.post(url=url3, data=data3)  # res即返回的响应对象
print('res3=:' + res3.text)  # 输出响应的文本

JSON类型的POST请求(application/json)

url4 = url+"NewKingCoach/checkCoachAttendInfo"
data4 = '''{
        "_token": token,
        "cid": cid
        }''' # 多行文本, 字符串格式,也可以单行(注意外层有引号,为字符串) data = '{"_token": token,'cid':''}'
res4 = requests.post(url=url4, data=str_data)      # data支持字典或字符串
print('res4=:' + res4.text)

data参数支持字典格式也支持字符串格式,如果是字典格式,requests方法会将其按照默认表单urlencoded格式转换为字符串,如果是字符串则不转化
如果data以字符串格式传输需要遵循以下几点:

  • 必须是严格的JSON格式字符串,里面必须用双引号,k-v之间必须有逗号,布尔值必须是小写的true/false等等
  • 不能有中文,直接传字符串不会自动编码

一般来说,建议将data声明为字典格式(方便数据添加修改),然后再用json.dumps()方法把data转换为合法的JSON字符串格式

url4 = url+"NewKingCoach/checkCoachAttendInfo"
data4 = '''{
        "_token": token,
        "cid": cid
        }'''
headers = {"Content-Type":"application/json"} # 严格来说,我们需要在请求头里声明我们发送的格式
str_data = json.dumps(data4)   # 序列化,转化为合法的JSON文本(方便HTTP传输)
res4 = requests.post(url=url4, data=str_data, headers=headers)     #  将字典格式的data变量转换为合法的JSON字符串传给post的data参数
print('res4=:' + res4.text)  # JSON文本格式的响应信息
res_dict = res4.json()
  • indent: 缩进空格数,indent=0输出为一行
  • sork_keys=True: 将json结果的key按ascii码排序
  • ensure_ascii=Fasle: 不确保ascii码,如果返回格式为utf-8包含中文,不转化为\u…
print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False)) # 重新转为文本
"""
响应转为json对象(字典)json.dumps(res_dict)输入如下:
{
  "code": 0,
  "data": {
    "status": 2
  },
  "msg": "ok"
}
"""
print(res_dict['code'])   # 方便获取其中的参数值
"""
code 输入如下:
0
"""

"""
一般在组装data参数时,建议使用字典格式,发送请求时用json.dumps(data)转化为文本发送
收到请求后使用json.loads(res.text)转化为字典,方便我们获取其中的参数信息
"""

JSON类型解析

序列化和反序列化
程序中的对象,如Python中的字典、列表、函数、类等,都是存在内存中的,一旦断电就会消失,不方便传递或存储,所以我们需要将内存中的对象转化为文本或者文件格式,来满足传输和持久化(存储)需求

  • 序列化: 内存对象 -> 文本/文件
  • 反序列化: 文本 -> 内存对象

对象在HTTP中的传输过程
HTTP协议是超文本传输协议,是通过文本或二进制进行传输的,所以我们发送的请求要转化成文本进行传输,收到的响应也是文本格式,如果是JSON,一般还需要将文本格式重新转化为对象

JSON对象(Python字典) -> 转为文本请求 -> 发送请求
-> 服务器收到文本请求 -> 将文本请求转化为对象,获取其中的参数,处理业务
-> 返回文本格式的响应 -> 客户端转为对象格式来从响应中取值

JSON对象与Python字典的区别
JSON对象是javascript object即javascript中的对象,是一种通用的格式,格式严格,不支持备注。

JSON文本和JSON对象的区别:

  • JSON文本是符合JSON格式的文本,实际上是一个字符串
  • JSON对象是内存中一个对象,拥有属性和方法,可以通过对象获取其中的参数信息

Python中我们一般提到JSON对象指的是字典

Python的字典的格式和JSON格式,稍有不同:

  • 字典中的引号支持单引号和双引号,JSON格式只支持双引号
  • 字典中的True/False首字母大写,JSON格式为true/false
  • 字典中的空值为None, JSON格式为null

JSON格式操作方法

  • 序列化(字典 -> 文本/文件句柄): json.dumps()/json.dump()
  • 反序列化(文本/文件句柄 -> 字典) : json.loads()/json.load()
import json # 需要导入JSON包

data = {'name': '张三', 'password': '123456', "male": True, "money": None} # 字典格式
str_data = json.dumps(data) # 序列化,转化为合法的JSON文本(方便HTTP传输)
print(str_data)

输出:{“name”: “\u5f20\u4e09”, “password”: “123456”, “male”: true, “money”: null}

json.dumps()支持将json文本格式化输出

import requests 
import json

res = requests.post("http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=怎么又是你") 
print(res.text) # 输出为一行文本
res_dict = res.json() # 将响应转为json对象(字典)等同于`json.loads(res.text)`
print(json.dumps(res_dict, indent=2, sort_keys=True, ensure_ascii=False)) # 重新转为文本

看一下输出结果对比:

{"code":100000,"text":"我才要说怎么又是你"}  # res.text,有些接口中文会返回为\u..
{
  "code": 100000,
  "text": "我才要说怎么又是你"  # 树状格式,比较清晰,显示中文
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值