如何移除HttpClient的if-else分支,直接传递GET/POST请求方法调用?
可以移除if-else分支,直接传入请求方法实现调用
当然可以这么做,而且这种方式会让代码更简洁、扩展性更强,避免后续新增请求类型时不断堆砌if-else分支。下面提供两种可行的实现方式:
方式一:直接传入session的请求方法(最简洁)
修改HttpClient的send_request方法,去掉request_type枚举参数,直接接收session的请求方法(比如session.get、session.post)作为参数:
import requests from typing import Dict class HttpClient: @staticmethod def send_request(request_func, url: str, data: Dict, headers: Dict): # 直接调用传入的请求方法 return request_func(url=url, json=data, headers=headers)
使用示例
# 初始化session session = requests.Session() # 发送GET请求 get_response = HttpClient.send_request( session.get, url="https://example.com/api/data", data={"id": 123}, headers={"Content-Type": "application/json"} ) # 发送POST请求 post_response = HttpClient.send_request( session.post, url="https://example.com/api/data", data={"name": "test"}, headers={"Content-Type": "application/json"} )
方式二:保留枚举但消除分支(兼容原有枚举依赖)
如果你的代码其他地方依赖HttpRequestType枚举,不想完全去掉它,可以给枚举添加请求方法的映射,通过枚举直接获取对应的session方法:
from enum import Enum import requests class HttpRequestType(Enum): GET = ('Get', requests.Session.get) POST = ('Create', requests.Session.post) PUT = ('Update', requests.Session.put) DELETE = ('Delete', requests.Session.delete) def __init__(self, label, request_method): self.label = label # 保留原有的标签值 self.request_method = request_method # 映射对应的session请求方法 class HttpClient: @staticmethod def send_request(session: requests.sessions.Session, request_type: HttpRequestType, url: str, data: Dict, headers: Dict): # 直接调用枚举中映射的方法,无需if-else return request_type.request_method(session, url=url, json=data, headers=headers)
使用示例
session = requests.Session() # 用枚举发送PUT请求 put_response = HttpClient.send_request( session=session, request_type=HttpRequestType.PUT, url="https://example.com/api/data/123", data={"name": "updated"}, headers={"Content-Type": "application/json"} )
补充说明
你提供的补充代码示例也是一种可行的通用调用方式,但要注意参数传递的一致性:比如requests的get/post方法中,json和data参数的作用不同(前者发送JSON格式请求体,后者发送表单格式),如果你的场景需要发送表单数据,要调整参数传递逻辑,避免混用。
这种函数式的参数传递方式,核心是把方法作为一等公民传递,让send_request只负责统一调用逻辑,不用关心具体是哪种请求类型,符合单一职责原则,后续新增PATCH等请求类型时,完全不需要修改send_request方法。
内容的提问来源于stack exchange,提问作者Ran Pol
相关产品推荐
相关产品推荐

