Swift遵循EndPoint协议结构体如何合并默认与传入的Alamofire HTTPHeaders
问题根源
- 你当前定义的
headers是纯计算属性,没有对应的存储容器存放外部传入的自定义头部,get方法每次调用都会重新生成只包含默认规则的头部集合,因此init中传入的header没有持久化存储的位置,不会生效。 - 现有set方法没有实现存储逻辑,即使赋值也不会保留内容,若直接在get中拼接set传入的值,还会出现重复添加的问题。
- 原
EndPoint协议中headers属性未声明{ get set },不支持写操作,需要先补全协议定义。
修复方案
第一步:补全协议定义
protocol EndPoint { var url: URL { get } var method: HTTPMethod { get } var parameters: Parameters? { get set } var headers: HTTPHeaders? { get set } // 补全读写权限声明 }
第二步:改造APIConstructor实现
新增私有存储属性专门存放自定义头部,合并逻辑放在get方法中统一处理,Alamofire的HTTPHeaders自带的合并逻辑会自动覆盖同名头部,自定义头部优先级高于默认头部,不会出现重复问题。
修改后的完整代码:
struct APIConstructor: NetworkEndPoint { var url: URL var method: HTTPMethod var parameters: Parameters? // 私有存储容器,保存外部传入的自定义头部 private var customHeaders: HTTPHeaders? init(urlString: String, method: HTTPMethod = .get, parameters: Parameters? = nil, headers: HTTPHeaders? = nil) { url = URLGenerator.path(endPoint: urlString, service: service) self.method = method self.parameters = parameters // 直接存储传入的头部即可 self.customHeaders = headers print("+++++++++ \(self.headers)") } var headers: HTTPHeaders? { get { // 生成默认头部 var finalHeaders: HTTPHeaders = [HTTPHeader(name: "Content-type", value: contentType.rawValue)] if let token = LoggedUserDetails.shared.token { finalHeaders.add(HTTPHeader.authorization(bearerToken: token)) } // 合并自定义头部,同名头部自定义值会覆盖默认值 if let custom = customHeaders { finalHeaders.add(contentsOf: custom) } return finalHeaders } set { // 存储外部设置的头部 customHeaders = newValue } } }
效果说明
- 无自定义头部传入时,返回默认的Content-Type和鉴权头部
- 有自定义头部传入时,自动合并到默认头部集合中,同名字段以自定义传入值为准
- 合并逻辑仅在每次get调用时执行一次,不会出现重复添加的问题
内容的提问来源于stack exchange,提问作者Usama bin Attique
相关产品推荐
相关产品推荐

