You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 01:01:19