Подтвердить что ты не робот

Распечатать тело запроса Alamofire

Я использую библиотеку Alamofire для подключения к API в iOS. У меня проблема в одном из соединений, и я не знаю, связано ли это с данными, закодированными в теле или любой другой вещи. Чтобы обнаружить мою ошибку, я пытаюсь напечатать на консоли тело запроса для проверки того, отправляю ли я правильную структуру данных.

Мой код следующий:

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)
            }
    }
}

Пользователь - объект 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 и его замены для переменной параметров)

Любая идея о моих проблемах?

EDIT:

Следуя предложению @Travis, я наконец нашел решение для печати тела запроса. Ниже вы можете найти код:

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

О передаче в качестве параметров объекта, с которым я не мог работать, я следил за официальной документацией, но я мог это сделать.

4b9b3361

Ответ 1

Ответ на ваш первый вопрос:

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

Что касается вашего второго вопроса, есть целый раздел об абстракции параметров API, а также CRUD и авторизация на главной странице Alamofire.

Ответ 2

Для Swift 3 +

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

Ответ 3

Просто, чтобы сделать это немного легче.

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

Ответ 4

Добавлено нижеприведенное расширение для класса 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
   })

URL ссылки: ссылка