【问题标题】:Print Alamofire request body打印 Alamofire 请求正文
【发布时间】:2015-10-04 23:01:27
【问题描述】:

我正在使用 Alamofire 库来连接 iO 中的 API。我在其中一个连接中有问题,我不知道是因为正文中编码的数据还是其他任何原因。为了检测我的错误,我尝试在控制台中打印请求正文以检查我是否发送了正确的数据结构。

我的代码如下:

func updateUser (#user: User, completionHandler: (responseObject: User?, error: AnyObject?) -> ()) {
    let parameters = [
        "_id": "\(user._id!)",
        "email": "\(user.email!)",
        "media": "\(Mapper().toJSONArray(user.media!))",
        "blogs": "\(Mapper().toJSONArray(user.blogs!))"
    ]

    var manager = Alamofire.Manager.sharedInstance
    manager.request(.PUT, apiUrl + "/route/to/api", parameters: parameters, encoding: .JSON)
        .responseObject{ (req: NSURLRequest, res: NSHTTPURLResponse?, user: User?, data: AnyObject?, error: NSError?) in
            if(error != nil) {
                NSLog("Error API updateUser: \(error)")
            }
            else {
                completionHandler(responseObject: user as User?, error: data)
            }
    }
}

User 是一个可映射对象,因为我使用 ObjectMapper 和 Alamofire 结合。用户由以下代码定义:

class User: Mappable {
   var _id: String?
   var name: String?
   var media: [Media]?

   init(_id: String, name: String, media: [Media]){
      self._id = _id;
      self.name = name;
      self.media = media
   }

   required init=(_ map: Map){
      mapping(map)
   }

   func mapping(map: Map){
      _id <- map["_id"]
      name <- map["name"]
      media <- map["media"]
   }
}

媒体的定义类似于用户,但具有不同的变量。

另外,我想知道,除了打印请求正文之外,我是否可以以更有效的方式将参数包含到 Alimofire 请求中(例如解析用户对象并将其替换为参数变量)

对我的问题有任何想法吗?

编辑:

按照@Travis 的建议,终于找到了打印请求正文的解决方案。您可以在下面找到代码:

println("request body: \(NSString(data:req.HTTPBody!, encoding:NSUTF8StringEncoding) as String?)")

关于将对象作为参数传递,我无法使用它,我遵循了官方文档,但我可以做到。

【问题讨论】:

标签: ios iphone swift alamofire


【解决方案1】:

对于 Swift 3+

print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))

【讨论】:

  • 这是基于 Swift3.0 的非常好的演示,它在我身边工作。
【解决方案2】:

第一个问题的答案是,

println("request body: \(request.HTTPBody)")

就您的第二个问题而言,Alamofire main page 上有一整节关于 API 参数抽象以及 CRUD 和授权。

【讨论】:

  • 感谢您的回答,但是 request.HTTBody 返回 NSData 对象,我不知道它是否是我期望的字符串。我希望得到这样的东西:// HTTP body: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} (用我的自己的变量),我得到以下信息:
  • 有无数种方法可以将 NSData 转换为字符串(或 JSON)。我建议使用这里的搜索来找到其中之一。
  • 如何打印Alamofire.upload()方法的请求正文?我正在做多部分。
【解决方案3】:

为请求类添加了以下扩展以打印日志。

extension Request {
    public func debugLog() -> Self {
        #if DEBUG
            debugPrint("=======================================")
            debugPrint(self)
            debugPrint("=======================================")
        #endif
        return self
    }
}

要使用扩展,只需在定义请求后使用 debugLog(),如下所示:

Alamofire.request(url).debugLog()
            .responseJSON( completionHandler: { response in
   })

参考网址:link

【讨论】:

  • 如何打印Alamofire.upload()方法的请求正文?我正在做多部分。
【解决方案4】:

对于 Swift 4 和 Swift 5,就像这样:

String(data: data!, encoding: String.Encoding.utf8)

如果不在 DefaultDataResponse 扩展或对象中,请将数据替换为 yourObject.response.data

【讨论】:

    【解决方案5】:

    只是为了让它更容易一点。

        if let requestBody = request.request?.HTTPBody {
            do {
                let jsonArray = try NSJSONSerialization.JSONObjectWithData(requestBody, options: [])
                print("Array: \(jsonArray)")
            }
            catch {
                print("Error: \(error)")
            }
        }
    

    【讨论】:

      【解决方案6】:

      斯威夫特 5

      print(response.debugDescription)
      

      【讨论】:

      【解决方案7】:

      来自 Alamofire 文档https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output

      可以获取curl请求描述

      AF.request("https://httpbin.org/get")
          .cURLDescription { description in
              print(description)
          }
          .responseDecodable(of: DecodableType.self) { response in
              debugPrint(response.metrics)
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-17
        • 2019-06-14
        • 1970-01-01
        • 2021-04-28
        • 2019-11-14
        • 2020-12-23
        • 2018-12-11
        • 1970-01-01
        相关资源
        最近更新 更多