Alamofire,post 请求 [string:any] 的 HTTPheaders

Alamofire, HTTPheaders for post request [string:any]

我需要使用 alamofire 向我的服务器发送一个 post 请求,要发送的 header 之一不是字符串值,而是一个 Int

阅读 Alamofire 的文档看起来 HTTPHeaders 只是类型 [String: String]

有没有办法将 HTTPHeaders 自定义为 [String:Any]?

我在网上找不到太多适合我理解的内容。

谢谢

Alamofire 没有这样的方法,但你可以轻松做到

["hey": 1].mapValues { String(describing: [=13=]) } returns [String: String]

如果你有很多地方使用它,你可以:

  1. Dictionary
  2. 创建扩展
extension Dictionary where Key == String, Value == Any {
    func toHTTPHeaders() -> HTTPHeaders {
        HTTPHeaders(mapValues { String(describing: [=10=]) })
    }
}
// Usage
AF.request(URL(fileURLWithPath: ""), headers: ["": 1].toHTTPHeaders())
  1. HTTPHeaders
  2. 创建扩展
extension HTTPHeaders: ExpressibleByDictionaryLiteral {
    public init(dictionaryLiteral elements: (String, Any)...) {
        self.init()

        elements.forEach { update(name: [=11=].0, value: String(describing: [=11=].1)) }
    }
}
// usage
AF.request(URL(fileURLWithPath: ""), headers: HTTPHeaders(["": 1]))
  1. Session
  2. 创建扩展
extension Session {
    open func request(_ convertible: URLConvertible,
                      method: HTTPMethod = .get,
                      parameters: Parameters? = nil,
                      encoding: ParameterEncoding = URLEncoding.default,
                      headers: [String: Any],
                      interceptor: RequestInterceptor? = nil,
                      requestModifier: RequestModifier? = nil) -> DataRequest {

        return request(convertible, method: method, parameters: parameters, encoding: encoding, headers: headers.mapValues { String(describing: [=12=]) }, interceptor: interceptor, requestModifier: requestModifier)
    }
}

// Usage
AF.request(URL(fileURLWithPath: ""), headers: ["": 1])

Alamofire 中没有此类选项的原因是类型安全。当您使用 Any 时,您可以在那里传递任何值,因此出错的可能性要大得多。通过要求字符串库确保您自己转换所有需要的值。

我会选择第一个变体,因为当您阅读代码时会更清楚那里发生了什么