Python 发送网络请求接口

302 阅读4分钟
import json
import requests


class GetRequest:
    def noParams(self):
        url = "http://httpbin.org/get"  # 1、请求组装
        res = requests.get(url)  # 2、发送get请求,获得响应结果
        return res.text  # 3、打印结果

    def params(self):
        url = "http://www.tuling123.com/openapi/api"
        params = {"key": "ec961279f453459b9248f0aeb6600bbe", "info": "你好"}
        res = requests.get(url=url, params=params)
        return res.text


class PostRequest:
    def fromType(self):  # x-www-form-urlencoded
        headers = {"Content-Type": "x-www-form-urlencoded"}  # 严格来说,我们需要在请求头里声明我们发送的格式
        url = "http://httpbin.org/post"
        data = {"name": "hanzhichao", "age": 18}
        # files = {'file': open('E://report.txt', 'rb')}  # 如果传参为文件,则选择files
        res = requests.post(url=url, data=data, headers=headers)  # files=files
        return res.text

    def jsonType(self):  # application/json
        headers = {"Content-Type": "application/json"}  # 严格来说,我们需要在请求头里声明我们发送的格式
        url = "http://httpbin.org/post"
        # data = '''{
        #         "name": "hanzhichao",
        #         "age": 18
        #         }'''
        data = json.dumps({"name": "hanzhichao", "age": 18})  # dumps:将python对象解码为json数据
        # data参数支持字典格式也支持字符串格式,如果是字典格式,requests方法会将其按照默认表单urlencoded格式转换为字符串,如果是字符串则不转化。
        # 一般来说,建议将data声明为字典格式(方便数据添加修改),然后再用json.dumps()方法把data转换为合法的JSON字符串格式
        res = requests.post(url=url, data=data, headers=headers)
        return res.text





"""
Python中字典和JSON的区别:
字典是一种数据结构,JSON对象是一种通用JavaScript数据格式;
1、字典支持单引号和双引号,JSON只支持双引号;
2、字典中的True和False首字母大写,JSON中的true和false首字母小写;
3、字典中的空值为None,JSON中的空值为null;

JSON格式操作方法  和反序列化:
1、序列化(字典-->文本/文件句柄):json.dumps()/json.dump()   将Python字典转变为JSON对象
2、反序化(文本/文件句柄-->字典):json.loads()/json.load()   将JSON对象转换为Python字典
"""


class JsonTest:
    def jsonDumps(self):
        data = {'name': '张三', 'password': '123456', "male": True, "money": None}  # 字典格式
        res = json.dumps(data)
        return res

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

    def jsonLoads(self):
        text = '{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}'  # JSON文本格式的响应信息,字符串
        res = json.loads(text)
        return (res, res['name'])

    # 输出 ({'name': '张三', 'password': '123456', 'male': True, 'money': None}, '张三')

    def jsonDump(self):
        dict = {'name': '张三', 'password': '123456', "male": True, "money": None}  # 字典格式
        f = open("demo1.json", "w")
        json.dump(dict, f)
        f.close()

    # 查看同级目录,增加了一个demo1.json文件,内容为:{"name": "\u5f20\u4e09", "password": "123456", "male": true, "money": null}



# {
#     "name": "张三",
#     "password": "123456",
#     "male": true,
#     "money": null
# }


    def jsonLoad(self):
        f = open("demo2.json", 'r', encoding="utf-8")  # 文件中有中文需要指定编码
        dict = json.load(f)  # 反序列化将文件句柄转化为字典
        print(dict['name'])
        f.close()

    # 张三


if __name__ == '__main__':
    print(JsonTest.jsonLoad(None))

requests库详解#

请求方法#

  • requests.get()
  • requests.post()
  • requests.put()
    ...
  • requests.session(): 用于保持会话(session)
    除了requests.session()外,其他请求方法的参数都差不多,都包含url,params, data, headers, cookies, files, auth, timeout等等

请求参数#

  • url: 字符串格式,参数也可以直接写到url中
  • params:url参数,字典格式
  • data: 请求数据,字典或字符串格式
  • headers: 请求头,字典格式
  • cookies: 字典格式,可以通过携带cookies绕过登录
  • files: 字典格式,用于混合表单(form-data)中上传文件
  • auth: Basic Auth授权,数组格式 auth=(user,password)
  • timeout: 超时时间(防止请求一直没有响应,最长等待时间),数字格式,单位为秒

响应解析#

  • res.status_code: 响应的HTTP状态码
  • res.reason: 响应的状态码含义
  • req.text:响应的文本格式,按req.encoding解码
  • req.content: 响应的二进制格式
  • req.encoding: 解码格式,可以通过修改req.encoding='utf-8'来解决一部分中文乱码问题
  • req.apparent_encoding:真实编码,由chardet库提供的明显编码
  • req.json(): (注意,有括号),响应的json对象(字典)格式,慎用!如果响应文本不是合法的json文本,或报错
  • req.headers: 响应头
  • req.cookies: 响应的cookieJar对象,可以通过req.cookies.get(key)来获取响应cookies中某个key对应的

import requests

res = requests.get("https://www.baidu.com")
print(res.status_code, res.reason)  # 200 OK
print(res.text)  # 文本格式,有乱码
print(res.content)  # 二进制格式
print(res.encoding)  # 查看解码格式 ISO-8859-1
print(res.apparent_encoding)  # utf-8
res.encoding = 'utf-8'  # 手动设置解码格式为utf-8
print(res.text)  # 乱码问题被解决
print(res.cookies.items())  # cookies中的所有的项 [('BDORZ', '27315')]
print(res.cookies.get("BDORZ"))  # 获取cookies中BDORZ所对应的值 27315
import jsonpath

s = {
    "data": {
        "status": 1,
        "user": {
            "id": "leilei_id_66666",
            "account_name": "leilei",
            "nick_name": "leilei",
            "token": "da335ef2a9579c84927c90a002162490",
            "menu": "["客户管理","/customer/serviceList","/customer/newService","/customer/customerList","/customer/serviceUpdate","/customer/health","/progressManagement/riskListNew","/progressManagement/taskMark","/capricorn","/progressManagement/taskIntervention","/progressManagement/reform","/progressManagement/riskAccidentEvent","/progressManagement/pptList","/progressManagement/riskDealListNew","/progressManagement/securityEventList","/progressManagement/markTable","/progressManagement/interventionTable","/progressManagement/newMark","/progressManagement/newIntervention","/progressManagement/voiceDownloadLog","胎温胎压处理","/progressManagement/tires/monitor","/progressManagement/tires/statistics","/progressManagement/CameraCoverAbnormal","/progressManagement/NotRun","/progressManagement/maintenanceList","保险服务","/insurance/caseTracingView","/insurance/caseRecords","/insurance/accident","/security/weeklyTest","/security/newWeekly","/security/analysis","/security/tangDoubleList","/security/wechatGroupSending","/security/wechatTable","/security/wechatMessageTable","信息管理","/infoManagement/mailList","一键报修","/fixed/index","健康度","/productHealth/productHealthIndex","/productHealth/abnormalTrends","/productHealth/equipmentMonitoringCenter","/authority/userList","/authority/roleConfig","/authority/PMmanagement","/authority/team","操作日志","/logs/logHistory"]"
        }
    },
    "code": 0,
    "msg": "success",
    "time": 1615969440.276317
}

# 使用jsonpath必须要是字典
r1 = jsonpath.jsonpath(s, '$.code')  # 精准匹配
r2 = jsonpath.jsonpath(s, '$.data.user.id')  # 根据路径进行匹配
r3 = jsonpath.jsonpath(s, '$..token')  # ..模糊匹配
print(r3)