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 文件读写操作实例详解
Mar 12 Python
Python深入学习之闭包
Aug 31 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python中的自省(反射)详解
Jun 02 Python
python 获取网页编码方式实现代码
Mar 11 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
wxPython实现分隔窗口
Nov 19 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
详解Python 函数参数的拆解
Sep 02 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
桌面中心(一)创建数据库
2006/10/09 PHP
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
CI框架常用方法小结
2016/05/17 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python素数检测的方法
2015/05/11 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
python3抓取中文网页的方法
2015/07/28 Python
python基础练习之几个简单的游戏
2017/11/10 Python
Python基于动态规划算法解决01背包问题实例
2017/12/06 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python暴力破解Mysql数据的示例
2020/11/09 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
2020/12/22 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
师范生自荐信范文
2013/10/06 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
大学自主招生自荐信范文
2014/02/26 职场文书
文化建设工作方案
2014/05/12 职场文书
世界遗产导游词
2015/02/13 职场文书
Python find()、rfind()方法及作用
2022/12/24 Python