Python3 requests实现批量rest请求和响应

背景:某个租户下有200万条虚机的脏数据记录要删除,可以通过虚机的id进行删除。

1)  查询某个租户下虚机id的接口 post /api/v1/{tenant-id}/all_vms

响应体  [vmid1,vmid2,vmid3]

2) 删除虚机的接口 delete /api/v1/vm

Python实现脚本

#! /usr/bin/env python3

# -*- coding: utf-8  -*-


import requests

import json


def get_vm_id_req():

    vmid_req={

        "create_time": 20200101,

        "vm_status":"active"

        }

      return vmid_req


def get_vm_id():

    req_url= "http://ip:port/api/v1/88888/all_vms"

    req_header={}

    req_header["Content-type"]= "application/json"

    req_header["cookie"]="username=robot, token=zsmtxmzsmtxm202007"

    resp= requests.post(req_url, header= req_header,data=json.dumps(vmid_req), verify=False)

    print (resp.content)  #打印响应内容

    print (resp.status_code)

    with open('vm_id.json' , 'w',  encoding=  'utf-8') as file_obj:

      file_obj.write(json.dumps( resp.content))

      file_obj.close()


def delete_vmid_req():

    with open('vm_id.json' ,'r', encoding='utf-8') as file_obj:

        vmid=json.loads( file_obj.read())

    del_vmid_req={

          "vmid": vmid

        }


def delete_vm_id():

    req_url= "http://ip:port/api/v1/vm"

    req_header={}

    req_header["Content-type"]= "application/json"

    req_header["cookie"]="username=robot, token=zsmtxmzsmtxm202007"

    resp= requests.deletet(req_url, header= req_header,data=json.dumps(del_vmid_req))

    print (resp.content)  #打印响应内容

    print (resp.status_code)


if __name__ == "__main__":

      get_vm_id(get_vm_id_req())

      delete_vm_id(delete_vmid_req())

执行命令 python3 delete-vm.py

requests类库使用说明

requests类库中文使用说明

1. Requests简单使用说明

# 导入 Requests 模块:

>>> import requests

# 初始化一个叫 r 的Response对象。从这个对象中获取所有想要的信息。

>>> r = requests.get('https://api.git.com/')

发送一个 HTTP POST请求:

>>> r = requests.post('http://httpbin.org/', data = {'key':'value'})

发送一个 HTTP PUT请求:

>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})

发送一个 HTTP delete请求:

>>> r = requests.delete('http://bin.org/del')

发送一个 HTTP head请求:

>>> r = requests.head('http://bin.org/get')

发送一个 HTTP options请求:

>>> r = requests.options('http://bin.org/get')

以字节的方式获取请求响应体:r.content

requests内置的JSON解码器: r.json()

获取响应码:r.status_code

以字典形式获取响应头:r.headers

2. 传递 URL 参数

Requests 允许使用 params关键字参数,以一个字符串字典来提供这些参数。

>>> payload = {'key': 'value', 'key2': 'value2'}

>>> r = requests.get("http://httpbin.org/get", params=payload)

3. 原始响应内容(流数据下载)

在罕见的情况下,可能想获取来自服务器的原始套接字响应,那么可以访问 r.raw。 请确保在初始请求中设置了stream=True

>>> r = requests.get('https://github.com/', stream=True)

>>> r.raw

<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>

>>> r.raw.read(10)

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

一般情况下,将文本流保存到文件:

with open(filename, 'wb') as fd:

    for chunk in r.iter_content(chunk_size):

            fd.write(chunk)

使用Response.iter_content将会处理大量直接使用Response.raw不得不处理的。 当流下载时,上面是优先推荐的获取内容方式。

4. 定制请求头

#为请求添加 HTTP 头部

>>> url = 'https://api.github.com/endpoint'

>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r = requests.get(url, headers=headers)

注意: 定制 header 的优先级低于某些特定的信息源,例如:

如果在 .netrc中设置了用户认证信息,使用 headers= 设置的授权就不会生效。而如果设置了auth= 参数,``.netrc`` 的设置就无效了

如果被重定向到别的主机,授权 header 就会被删除。

代理授权 header 会被 URL 中提供的代理身份覆盖掉。

在判断内容长度的情况下,header 的 Content-Length 会被改写。

进一步讲,Requests不会基于定制header的具体情况改变自己的行为。不过在最后的请求中,所有的header信息都会被传递进去。

注意: 所有的header值必须是string、bytestring或者unicode。尽管传递unicode  header也是允许的,但不建议这样做。

5. 重定向与请求历史

默认情况下,除了HEAD外,Requests会自动处理所有重定向。

可以使用响应对象的 history 方法来追踪重定向。Response.history 是一个Response对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。

如果使用的是GET、OPTIONS、POST、PUT、PATCH 或者 DELETE,那么可以通过 allow_redirects 参数禁用重定向处理

>>> r = requests.get('http://github.com', allow_redirects=False)

>>> r.status_code

301

>>> r.history

[]

如果使用了 HEAD,可以启用重定向

>>> r = requests.head('http://github.com', allow_redirects=True)

>>> r.url

'https://github.com/'

>>> r.history

[<Response [301]>]

6. 超时

requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应:

>>> requests.get('http://github.com', timeout=0.001)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)

注意:timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容