首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反射URLRequest

反射URLRequest
EN

Stack Overflow用户
提问于 2022-02-01 10:10:49
回答 1查看 74关注 0票数 0

我试图获取URLRequest的所有信息,以便将其保存在日志中。当我尝试做String(reflecting: request)时,问题就出现了。这种方法只给出我的最终网址,而不是所有其他信息,如身体,httpMethod,编码等。

但是,如果我执行po request,我可以看到请求的所有信息。

有什么暗示吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-02-01 10:54:03

您可以使用对象的.description.debugDescription来输出描述。这些属性分别依赖于CustomStringConvertibleCustomDebugStringConvertible协议。

要更改打印出来的内容,可以定义/重新定义协议的一致性。作为URLRequest的一个简单示例

代码语言:javascript
复制
extension URLRequest: CustomDebugStringConvertible {
   var debugDescription: String {
      """
      URL Request for \(self)
      full url \(self.url)
      header fields \(self.allHTTPHeaderFields)
      """
   }
}

let url = URL(string: "https://somedomain.com")
var request = URLRequest(url: url!)
request.addValue("ghuaidbwjkbdwd", forHTTPHeaderField: "Auhentication")
print(request.debugDescription)

威尔输出

代码语言:javascript
复制
URL Request for https://somedomain.com
full url Optional(https://somedomain.com)
header fields Optional(["Auhentication": "ghuaidbwjkbdwd"])

显然,您可能希望对输出做一些更有用的事情,但是这应该会给您提供一些工具。

当对具有预定义一致性的对象执行此操作时(例如。URLRequest,它是在基金会中定义的)您将得到关于以前的实现的警告。

在这个场景中,由于对象已经符合描述协议,所以您可以忽略它,而只是重写属性。因此,在上面的示例中,您应该实际使用

代码语言:javascript
复制
extension URLRequest {
   var debugDescription: String {

如果使用的对象是类,则需要将其标记为override

如果您想获取对象的所有属性,可以使用一个镜像。您可以使用扩展直接在对象上定义它,但是如果您可能在多个地方使用它,则可以通过具有默认实现的协议来实现它:

代码语言:javascript
复制
protocol Reflectable {
   func reflect()
}

extension Reflectable  {
   func reflect() {
      let mirror = Mirror(reflecting: self)
      print("\(Self.self) for: \(self)")
      for item in mirror.children {
         print("\(String(describing: item.label)): \(item.value)")
      }
   }
}

然后,您可以订阅URLRequest并直接访问.reflect()方法,或者将其构建到CustomStringConvertibleCustomDebugStringConvertible中。

代码语言:javascript
复制
extension URLRequest: Reflectable {}

request.reflect()

提供以下方面的产出:

代码语言:javascript
复制
URLRequest for: https://somedomain.com
Optional("url"): Optional(https://somedomain.com)
Optional("cachePolicy"): 0
Optional("timeoutInterval"): 60.0
Optional("mainDocumentURL"): nil
Optional("networkServiceType"): NSURLRequestNetworkServiceType
Optional("allowsCellularAccess"): true
Optional("httpMethod"): Optional("GET")
Optional("allHTTPHeaderFields"): Optional(["Auhentication": "ghuaidbwjkbdwd"])
Optional("httpBody"): nil
Optional("httpBodyStream"): nil
Optional("httpShouldHandleCookies"): true
Optional("httpShouldUsePipelining"): false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70938737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档