Ответ 1
Ответ на ваш первый вопрос:
println("request body: \(request.HTTPBody)")
Что касается вашего второго вопроса, есть целый раздел об абстракции параметров API, а также CRUD и авторизация на главной странице 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?)")
О передаче в качестве параметров объекта, с которым я не мог работать, я следил за официальной документацией, но я мог это сделать.
Ответ на ваш первый вопрос:
println("request body: \(request.HTTPBody)")
Что касается вашего второго вопроса, есть целый раздел об абстракции параметров API, а также CRUD и авторизация на главной странице Alamofire.
Для Swift 3 +
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
Просто, чтобы сделать это немного легче.
if let requestBody = request.request?.HTTPBody {
do {
let jsonArray = try NSJSONSerialization.JSONObjectWithData(requestBody, options: [])
print("Array: \(jsonArray)")
}
catch {
print("Error: \(error)")
}
}
Добавлено нижеприведенное расширение для класса 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 ссылки: ссылка