复制即用-python-[requests+httpServer]实现get, post, 发文件, 反馈文件等功能.
声明
所有方法都是最简最快速实现的核心代码,拿来就可以基本实现功能.
实际应用的话自己搞好异常处理.
代码
环境需求
# 客户端
# pip install requests
# pip install requests_toolbelt
import requests
from requests_toolbelt import MultipartEncoder
# 服务端
import cgi
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
发送及接收get请求
# 发送端
def send_get():
""" 发送get测试命令 """
response = requests.get('http://localhost:8888/get', verify=False)
print(response.text)
# 接收端
def get_test(self):
""" get命令的测试 """
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
rspstr = json.dumps(data)
self.wfile.write(rspstr.encode("utf-8"))
发送及接收post请求
# 发送端
def send_post():
""" 发送post测试命令 (注意数据格式是key1=1001的,不能用json在接收端直接解析)"""
payload_dict = {'key1':1001, 'key2':'测试信息', 'key3': ['value1', 'value2']}
response = requests.post('http://localhost:8888/post', data=payload_dict)
print(response.text)
def send_json_post():
""" 发送post测试命令 json格式 """
payload_dict = {'key1': 1001, 'key2': '测试信息', 'key3': ['value1', 'value2']}
response = requests.post('http://localhost:8888/post', json=payload_dict)
print(response.text)
# 接收端
def post_test(self):
""" post命令的测试 """
data_byte = self.rfile.read(int(self.headers["content-length"]))
data_obj = json.loads(str(data_byte, encoding = "utf-8"))
print("获取到的请求命令为:", data_obj)
self.send_response(200)
self.send_header("Content-type", 'application/json')
self.end_headers()
rspstr = json.dumps(data)
self.wfile.write(rspstr.encode("utf-8"))
发送携带参数与文件的multipart/form-data请求
# 发送端
def send_picture_json_post():
""" 同时发送参数及图像数据的multipart/form-data请求 """
url = "http://localhost:8888/postparamfile"
file_path = './images/test.jpg'
m = MultipartEncoder(
fields={"isNotKCode": "Y",
"fromCode": "啦啦啦啦啦",
"fromName": "鸡鸡歪歪!",
"sendName": "asdfas",
"sendMobile": "18526363636",
"sendPhone": "",
"sendAddress": "e5632452542345",
"uploadType": "1",
"fileType": "3",
"file": (file_path, open(file_path, 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})
}
)
response = requests.post(url, data=m, headers={"Content-Type": m.content_type, "jwt-token": "KYkmsPDBk"})
print(response.text)
# 接收端
def post_picture_param(self):
""" 同时携带参数及文件的 multipart/form-data 请求 """
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type'],
}
)
# 接收并保存图片
for field in form.keys():
if str(field) != 'file':
field_item = form[field]
filevalue = field_item.value
print(field, filevalue)
else:
field_item = form[field]
filename = field_item.filename
filevalue = field_item.value
filesize = len(filevalue) # 文件大小(字节)
print(filename, filesize)
with open("./images/saved.jpg", 'wb') as f:
f.write(filevalue)
# 给出一个反馈
self.send_response(200)
self.send_header("Content-type", 'application/json')
self.end_headers()
rspstr = json.dumps(data)
self.wfile.write(rspstr.encode("utf-8"))
发送请求获取图像
# 发送端
def send_back_file_post():
""" 发送一个请求图像命令,反馈一张图片 """
# 这是一个图片的url
# url = 'http://yun.itheima.com/Upload/Images/20170614/594106ee6ace5.jpg'
url = "http://localhost:8888/postbackfile"
param_dict = {'key1': 1001, 'key2': '测试信息', 'key3': ['value1', 'value2']}
response = requests.post(url, json=param_dict)
img = response.content
with open( './images/response.jpg','wb' ) as f:
f.write(img)
# 接收端
def post_back_file(self):
""" 接收到post命令需要反馈文件 """
data_byte = self.rfile.read(int(self.headers["content-length"]))
data_obj = json.loads(str(data_byte, encoding="utf-8"))
print("获取到的请求命令为:", data_obj)
self.send_response(200)
self.send_header('Content-Type', 'image/png')
with open('./images/test.jpg', 'rb') as f:
img_data = f.read()
img_len = len(img_data)
print('图像数据长度', img_len)
self.send_header('Content-Length', img_len) # os.path.getsize('Mario.png'))
self.end_headers()
self.wfile.write(img_data)
self.wfile.flush()