您现在的位置是:网站首页 > 博客日记 >

python—接口调用

作者:YXN-python 阅读量:148 发布日期:2022-10-01

一、接口请求

http 请求包含:请求行、请求头、请求体。【关于详情

http协议报文

1.请求报文 (请求行/请求头/请求数据/空行) 请求行: 请求方法字段、URL字段和HTTP协议版本  例如:GET/index.htmlHTTP/1.1  get方法将数据拼接在url后面,传递参数受限  请求方法:  GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT 请求头(key-value形式):  User-Agent:产生请求的浏览器类型。  Accept:客户端可识别的内容类型列表。  Host:主机地址 请求数据: post方法中,会把数据以keyvalue形式发送请求 空行:  发送回车符和换行符,通知服务器以下不再有请求头
2.响应报文 (状态行、消息报头、响应正文) 状态行 消息报头 响应正文

request

 import requests
 
 r = requests.get('https://api.github.com/events')                      # 获取网页信息
 r = requests.post('http://httpbin.org/post', data = {'key':'value'})   # 发送信息请求
 
 r = requests.put('http://httpbin.org/put', data = {'key':'value'})
 r = requests.delete('http://httpbin.org/delete')
 r = requests.head('http://httpbin.org/get')
 r = requests.options('http://httpbin.org/get')
 
 payload = {'key1': 'value1', 'key2': 'value2'}
 r = requests.get("http://httpbin.org/get", params=payload)
 
 print(r.url)       # 有返回,则URL已被正确编码
 print(r.text)      # 推测的文本编码
 print(r.content)   # 找到 (HTTP 和 XML自身可以指定编码格式)文本编码
 print(r.encoding)  # 常用于中文乱码解决。用于修改编码方式(使用 codecs 模块进行注册)

Requests 也可以使用定制的编码: 创建了自己的编码,如r.encoding = ‘ISO-8859-1’ 并使用 codecs 模块进行注册,你就可以轻松地使用这个解码器名称作为 r.encoding 的值, 然后由 Requests 来为你处理编码。 关于【响应中文乱码问题请点击

二、二进制请求与响应

GET 请求

以请求返回的二进制数据保存图片,保存文件。

 import requests
 from PIL import Image
 from io import BytesIO
 
 url = 'https://api.github.com/some/endpoint'
 headers = {'user-agent': 'my-app/0.0.1'}
 r = requests.get(url, headers=headers)
 
 i = Image.open(BytesIO(r.content))
 
 with open(filename, 'wb') as fd:
     for chunk in r.iter_content(chunk_size):
         fd.write(chunk)

POST 请求

 import requests
  
 payload = {'key1': 'value1', 'key2': 'value2'}
 
 r = requests.post("http://httpbin.org/post", data=payload)  # 简单地传递一个字典给 data 参数
 r = requests.post(url, data=json.dumps(payload))            # 传递str 而不是dict,数据会被直接发布出去。
 print(r.text)
 print(r.content)
 print(r.url)
 print(r.status_code)

多部分编码(Multipart-Encoded)的文件

 url = 'http://httpbin.org/post'
 files = {'file': open('report.xls', 'rb')}
 
 # 显式地设置文件名,文件类型和请求头
 files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
 
 # 发送作为文件来接收的字符串
 files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
 
 >>> r = requests.post(url, files=files)

建议你用二进制模式(binary mode)打开文件。这是因为 Requests 可能会试图为你提供 Content-Length header,在它这样做的时候,这个值会被设为文件的字节数(bytes)。如果用文本模式(text mode)打开文件,就可能会发生错误。 最好先用二进制的形式打开文件,将其编码成base64来进行传输: a = open("pdf_reference.pdf", "rb").read().encode("base64")

带参数,带请求头

小示例:

 import requests
 import json
 
 url = 'http://official-account/app/messages/group'
 body = {"type": "text", "content": "text", "tag_id": "20717"}
 headers = {'content-type': "application/json", 'Authorization': 'APP appid = 4abf1a,token = 9480295ab2e2eddb8'}
 
 response = requests.post(url, data = json.dumps(body), headers = headers)

三、关于图片的请求

图片和二进制格式互转

 # 以 二进制方式 进行图片读取
 with open("img.jpg","rb") as f:
 img_bin = f.read() # 以二进制方式读取的图片内容
 
 # 将 图片的二进制内容 转成 真实图片
 with open("img.jpg","wb") as f:
     f.write(img_bin) # img_bin里面保存着二进制流的图片内容

图片转成字节数组 image2bytearray 我打印了这两者输出,有些微差别,可以都试一下

 import io
 from PIL import Image
 
 #================ 方法一 ===================
 img = Image.open(r"C:\Users\xxx\Desktop\111.png", mode='r')
 
 imgByteArr = io.BytesIO()
 img.save(imgByteArr, format='png')
 
 imgByteArr = imgByteArr.getvalue()
 print('imgByteArr:',imgByteArr)
 
 #================ 方法二 ==================
 data = open(r"C:\Users\xxx\Desktop\111.png", 'rb').read()
 print('bytearray:',bytearray(data))

安装依赖:`pip3 install Pillow`

 from io import BytesIO
 from PIL import Image
 import requests
 
 res = requests.get('http://p1.pstatp.com/list/300x196/pgc-image/152923179745640a81b1fdc.webp', stream=True)  # 获取字节流最好加stream这个参数
 byte_stream = BytesIO(res.content)   # 把请求到的数据转换为Bytes字节流
 
 roiImg = Image.open(byte_stream)      # Image打开Byte字节流数据
 
 imgByteArr = io.BytesIO()             # 创建一个空的Bytes对象
 roiImg.save(imgByteArr, format='PNG') # PNG就是图片格式,我试过换成JPG/jpg都不行
 imgByteArr = imgByteArr.getvalue()    # 这个就是保存的图片字节流
 
 # 写入本地
 with open("./abc.png", "wb") as f:
     f.write(imgByteArr)
 
 #================ 方法三 ==================
 img = Image.open(BytesIO(byte_stream))
 img.save(save_name + img.format, quality=95)
 
 img = Image.open(BytesIO(byte_stream))
 img.save(save_name + img.format, quality=95)
 
 img = Image.frombytes("RGB", (18,18), img) # 图片格式,图片大小,图片数据流
 img.save("111.png")

转载自:csdn

YXN-python

2022-10-01