打印Alamofire请求正文

时间:2015-07-15 18:28:11

标签: ios iphone swift alamofire

我正在使用Alamofire库连接iOs中的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是一个Mappable对象,因为我使用的是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请求中(比如解析User对象并将其替换为参数变量)

关于我的问题的任何想法?

编辑:

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

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

关于作为参数传递一个对象我无法工作,我按照官方文档,但我可以做到。

6 个答案:

答案 0 :(得分:35)

Swift 3 +

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

答案 1 :(得分:9)

第一个问题的答案是,

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

就你的第二个问题而言,有一个关于API参数抽象的整个部分以及CRUD&amp;授权Alamofire main page

答案 2 :(得分:3)

添加了以下扩展Request类用于打印日志。

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

答案 3 :(得分:1)

只是为了让它变得更容易。

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

快捷键5

$validatedData = $request->validateWithBag('email', [
                'subject' => 'max:40|regex:/^[A-Za-z]+$/u',
                'body' => 'required|min:1|max:1000|regex:/^[A-Za-z0-9]+$/u'
            ],
            [
                'subject.max' => 'Subject can be maximum 40 symbols length.',
                'subject.regex' => 'In subject Only numbers and latin letters is allowed.',
                'body.required' => 'Message cannot be empty.',
                'body.min' => 'Message shall contain at least one character.',
                'body.max' => 'Message can be only 10000 symbols length.',
                'body.regex' => 'In message only numbers and latin letters is allowed.',
        ]);