2015-07-15 6 views
9

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

Мой код выглядит следующим образом:

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

Пользователь является объектом Присоединить геоинформацию, поскольку я использую 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 более эффективным способом (что-то вроде разбора объекта пользователя и подставляя его для параметров переменных)

Есть идеи о моих проблемах?

EDIT:

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

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

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

+0

Для запроса регистрации/ответ есть: https://github.com/konkab/AlamofireNetworkActivityLogger – neoneye

ответ

7

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

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

Насколько идет ваш второй вопрос, есть целый раздел по API параметров абстракции, а также CRUD & авторизации на Alamofire main page.

+1

Спасибо за ваш ответ, но request.HTTBody возвращение NSData, и я не могу знать, является ли это строкой, которую я ожидаю. Я ожидаю получить что-то вроде этого: _ // Тело HTTP: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} _ (с моими собственными переменными) и Я получаю следующее: _ <7b225f69 64223a22 35353962 61656165 ..._ – Alfonso

+0

Существует множество способов преобразования NSData в строку (или JSON). Я бы предложил использовать поиск здесь, чтобы найти один из них. – Travis

0

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

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

Для Swift 3+

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

Это действительно хорошая демонстрация на основе Swift3.0, работающая на моей стороне. – Kevin