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实现的多线程端口扫描工具分享
Jan 21 Python
python 文件操作api(文件操作函数)
Aug 28 Python
Python读取txt某几列绘图的方法
Oct 14 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Django REST framework 分页的实现代码
Jun 19 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
Django框架反向解析操作详解
Nov 28 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 Python
opencv检测动态物体的实现
Jul 21 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
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
php 购物车完整实现代码
2014/06/05 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
javascript自然分类法算法实现代码
2013/10/11 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
jquery选择器简述
2015/08/31 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
requireJS使用指南
2016/04/27 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python实现把回车符\r\n转换成\n
2015/04/23 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
Python读写及备份oracle数据库操作示例
2018/05/17 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
写好自荐信的要点
2013/11/06 职场文书
工程业务员岗位职责
2013/12/31 职场文书
《得道多助,失道寡助》教学反思
2014/04/19 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
慰问信范文
2015/02/14 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python
dubbo服务整合zipkin详解
2021/07/26 Java/Android
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android