Python request使用方法及问题总结


Posted in Python onApril 26, 2020

一、总结说明

模拟postman访问接口,具体参照七、python接口开发(二)>>三、postman访问接口,本篇文章调用的接口,也是来自于接口开发的源码,阅读本篇文章最好先看下python接口是怎样开发的

模拟get方式访问:res = requests.get(url,params=data,headers = headers)

第一种方式:res = requests.get(url, params=data, headers = headers)

第二种方式:res = requests.get(url, data=data, headers = headers)

注意:

1.url格式入参只支持第一种方式访问(params=data),json格式入参,只支持第二种方式(data=data)访问,
form-data格式入参可以使用第一种与第二种方式访问。

2.不管是那种格式的入参,data入参格式都是{“key”:“vaue”,“key1”:“vaue1"},注意参数最好用 " 而不是 ' 。

3.如果是url与form-data入参,data参数必须为字典类型,如果json入参,data必须为字符类型,字典转字符方法如下:data =json.dumps(data,ensure_ascii=False);

4.参数headers必须为字典类型,字符转字典方法如下:json.loads(headers),判断是否是字典方法如:isinstance(data,dict)
模拟post方式访问:
第一种方式:res = requests.post(url, params=data, headers = headers)
第二种方式:res = requests.post(url, data=data, headers = headers)

注意:

1.url格式入参只支持第一种方式访问(params=data),json格式入参,只支持第二种方式(data=data)访问,
form-data格式入参可以使用第一种与第二种方式访问。

2.不管是那种格式的入参,data入参格式都是{“key”:“vaue”,“key1”:“vaue1"},注意参数最好用 " 而不是 ' 。

3.如果是url与form-data入参,data参数必须为字典类型,如果json入参,data必须为字符类型,字典转字符方法如下:data =json.dumps(data,ensure_ascii=False);

4.参数headers必须为字典类型,字符转字典方法如下:json.loads(headers),判断是否是字典方法如:isinstance(data,dict)
常用响应方法

  • res.text:查看响应内容,返回的是Unicode格式的数据
  • res.content:查看响应内容,返回的字节流数据(主要用于存储图片)
  • res.url:查看完整访问url地址
  • res.encoding:查看响应头部字符编码
  • res.status_code:查看响应码

session与cookies

cookies操作步骤:
1.访问:res = requests.get(url)
2.返回cookie对象:cookiejar = res.cookies
3.转为字典:cookiedict = requests.utils.dict_from_cookiejar(cookiejar)

session操作步骤:

1. 创建session对象:ssion = requests.session()
2. 设置 headers:headers = {"key": "vaule"}
3. 设置登录入参:{"loginName":"sss", "userPass":"sss"}
4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存至sesion:ssion.post(url, data = data,headers=headers)
5. 直接访问需要登录的页面:ssion.get("https://www.sss.cn/preview/c_clg_web?d=233444")
ssl不验证
#https协议默认verify = True需要证书验证,verify = False表示不验证证书
res = requests.get(url,verify = False)

二、源码举例

#!/usr/bin/python3
# encoding:utf-8
'''
Created on 2020-04-21 08:20
@author: Administrator
'''
import requests
import json
from _ast import Try
from django.template.context_processors import request

class send():
  #1.get方式,无参数访问接口
  def send_get(self,url,data,headers = None):
    res = requests.get(url,params=data,headers = headers)
    return res
  #2.post方式,url格式入参访问接口
  def send_post_url(self,url,data,headers = None):
    res = requests.post(url, params=data, headers = headers)
    return res
  #3.post方式,form-data格式入参访问接口
  def send_post_fdata(self,url,data,headers = None):
    res = requests.post(url, params=data, headers = headers)
    return res
  #4.post方式,josn格式入参访问接口
  def send_post_json(self,url,data,headers = {'content-type': 'application/json'}):
    json_data =json.dumps(data,ensure_ascii=False)
    #特别注意,当文件头是json时 ,发送post请求参数data=值,值必须是json(字符型)
    res = requests.post(url, data=json_data, headers = headers)
    return res
  def cookies(self,url):
    res = requests.get(url)
    #保存CookieJar对象:
    cookiejar = res.cookies
    #将Cookie转为字典:
    cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
    return cookiedict
  def session(self):
    # 1. 创建session对象
    ssion = requests.session()
    # 2. 设置headers
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64; Trident/7.0; rv:11.0) like Gecko",
          "Accept":"image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*",
          "Accept-Language":"zh-Hans-CN,zh-Hans;q=0.5"}
    # 3. 设置登录入参
    data = {"loginName":"sss", "userPass":"sss"} 
    # 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存至sesion
    ssion.post("https://passport.sss.cn/login/login", data = data,headers=headers)
    # 5. 直接访问需要登录的页面
    res = ssion.get("https://www.sss.cn/preview/c_clg_web?d=233444")
    return res
  def ssl(self):
    #https协议默认verify = True需要证书验证,verify = False表示不验证证书
    res = requests.get("https://www.12306.cn/index/",verify = False)
    return res
if __name__ == '__main__':
  #1.get方式,无参数访问接口
  res1 = send().send_get('http://127.0.0.1:8888/index',{})
  print('1.get方式,无参数访问接口,返回值:')
  #响应内容json格式转字典
  print(res1.json())
  print('-------开始打印request常见响应方法内容---------------')
  print('查看响应内容,res.text 返回的是Unicode格式的数据')
  print(res1.text)
  print('查看响应内容,res.content返回的字节流数据(主要用于存储图片)')
  print(res1.content)
  print('查看完整url地址,res.url')
  print(res1.url)
  print('查看响应头部字符编码,res.encoding')
  print(res1.encoding)
  print('查看响应码,res.status_code')
  print(res1.status_code)
  print('-------结束打印request常见响应方法内容---------------')
  #2.post方式,url格式入参访问接口
  res2 = send().send_post_url('http://127.0.0.1:8888/article',{'id':'12589','token':'ASDE23EEE9'})
  print('2.post方式,url格式入参访问接口,返回值:')
  print(res2.json())
  #3.post方式,form-data格式入参访问接口
  res3 = send().send_post_fdata('http://127.0.0.1:8888/login',{'usrname':'test','pwd':'123456'})
  print('3.post方式,form-data格式入参访问接口,返回值:')
  print(res3.json())
  #4.post方式,josn格式入参访问接口
  res4 = send().send_post_json('http://127.0.0.1:8888/loginjosn',{"usrname": "test","pwd": "123456"})
  print('4.post方式,josn格式入参访问接口,返回值:')
  print(res4.json())
  res5 = send().cookies('http://www.baidu.com')
  print('5.访问百度打印colies,返回值:')
  print(res5)
  res6 = send().session()
  print('6.需要登录才可以看到资源,通过session可直接查看,返响应状态码:')
  print(res6.status_code)
  res7 = send().ssl()
  print('7.访问12306,设置不验证ssl,verify = False,返响应状态码:')
  print(res7.status_code)

运行结果

1.get方式,无参数访问接口,返回值:
{'msg': '成功访问首页', 'msg_code': 200}
-------开始打印request常见响应方法内容---------------
查看响应内容,res.text 返回的是Unicode格式的数据
{"msg": "成功访问首页", "msg_code": 200}
查看响应内容,res.content返回的字节流数据(主要用于存储图片)
b'{"msg": "\xe6\x88\x90\xe5\x8a\x9f\xe8\xae\xbf\xe9\x97\xae\xe9\xa6\x96\xe9\xa1\xb5", "msg_code": 200}'
查看完整url地址,res.url
http://127.0.0.1:8888/index
查看响应头部字符编码,res.encoding
utf-8
查看响应码,res.status_code
200
-------结束打印request常见响应方法内容---------------
2.post方式,url格式入参访问接口,返回值:
{'msg': '成功访问文章', 'msg_code': 200}
3.post方式,form-data格式入参访问接口,返回值:
{'msg': '登录成功', 'msg_code': 200}
4.post方式,josn格式入参访问接口,返回值:
{'msg': '登录成功', 'msg_code': 200}
5.访问百度打印colies,返回值:
{'BDORZ': '27315'}
6.需要登录才可以看到资源,通过session可直接查看,返回值:
200
D:\pythonaz\lib\site-packages\urllib3\connectionpool.py:997: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.12306.cn'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
warnings.warn(
7.访问12306,设置不验证ssl,verify = False,返响应状态码:
200

三、问题

1. json转字典,json格式入参问题

问题描述,发送get请求,响应内容转字典,如requests.get(url).json(),报错:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

原因:

1.响应内容不是json{key:vaule}格式;
2.json格式入参,如res = requests.post(url, data=data, headers = headers),入参data值为字典类型
3.字符转字典,字符个数不是key-value个数,或者key-vaule用的是单引号,如json.loads('key':'value')

解决方案:

1.响应内容必须是json格式才可以调用josn转字典json()方法
2.json格式入参,如res = requests.post(url, data=data, headers = headers),入参data值必须转换为字符类型
3.字符转字典,必须保证是key-vaule,并且参数引号必须用双引号,如json.loads("key":"value")

2. 接口无法访问

问题描述:发送get请求,requests.get(url),报错如下:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8888): Max retries exceeded with url: /index (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000025527634A00>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))

原因:1.8888端口无法访问;2.接口服务未开启

解决方案:1.设置8888端口可访问;2.开启接口服务

3. 发送个get/post失败

问题描述:发送get:request.get("http://www.baidu.com"),报错如下:

AttributeError: 'function' object has no attribute 'get'

原因:1.代码错误;2.变量名与系统(包括扩展库或者保留字)的重复

解决方法:本例是代码错误,request改为requests

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
Python3数据库操作包pymysql的操作方法
Jul 16 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
Python实现的文轩网爬虫完整示例
May 16 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
对于Python深浅拷贝的理解
Jul 29 Python
详解Python文件修改的两种方式
Aug 22 Python
Python生成个性签名图片获取GUI过程解析
Dec 16 Python
基于python实现地址和经纬度转换
May 19 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 Python
Python基于paramunittest模块实现excl参数化
Apr 26 #Python
在python里创建一个任务(Task)实例
Apr 25 #Python
python 实现任务管理清单案例
Apr 25 #Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 #Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 #Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 #Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 #Python
You might like
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
超清晰的document对象详解
2007/02/27 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
2018/06/19 Python
Python面向对象之类和对象属性的增删改查操作示例
2018/12/14 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python实现智能语音天气预报
2019/12/02 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
美国牙科折扣计划:DentalPlans.com
2019/08/26 全球购物
如何提高MySql的安全性
2014/06/19 面试题
Java基础知识面试题
2014/03/25 面试题
历史学专业推荐信
2013/11/06 职场文书
中学生差生评语
2014/01/30 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
简历自荐信范文
2015/03/09 职场文书
python基础之函数的定义和调用
2021/10/24 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL