2015-07-15 16 views
9

Używam biblioteki Alamofire do łączenia się z API w iOs. Mam problem w jednym z połączeń i nie wiem, czy to z powodu danych zakodowanych w ciele, czy w jakiejkolwiek innej sprawie. Aby wykryć mój błąd, próbuję wydrukować w konsoli treść żądania, aby sprawdzić, czy wysyłam poprawną strukturę danych.Drukuj Alamofire request body

Mój kod jest następujący:

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

Użytkownik jest odwzorowywalne obiektu, ponieważ używam ObjectMapper połączeniu z Alamofire. Użytkownik jest zdefiniowany przez następujący kod:

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"] 
    } 
} 

Nośnik definiowany jest jako Użytkownik, ale z różnymi zmiennymi.

Również chciałbym wiedzieć, oprócz wezwania druk ciała, czy mogę to parametry na życzenie Alimofire w bardziej efektywny sposób (coś jak analizowania obiektu użytkownika i zastąpienie go dla zmiennych parametrów)

Czy masz jakieś pojęcie o moich problemach?

EDIT:

Po sugestię @Travis wreszcie znalazłem rozwiązanie do drukowania treści żądania. Poniżej możesz znaleźć kod:

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

O przekazaniu parametrów obiektu nie mogłem go wykonać, poszedłem za oficjalną dokumentacją, ale mogłem to zrobić.

+0

Na żądanie logowania/odpowiedź jest: https://github.com/konkab/AlamofireNetworkActivityLogger – neoneye

Odpowiedz

7

Odpowiedź na pierwsze pytanie jest

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

O ile Twój 2-cia pytanie idzie, istnieje cały odcinek na API parametryczny abstrakcji jak CRUD & Zezwolenie na Alamofire main page.

+1

Dziękuję za odpowiedź, ale request.HTTBody powrót Obiekt NSData, i nie mogę wiedzieć, czy jest to łańcuch, którego oczekuję. Spodziewam się uzyskać coś takiego: _ // Ciało HTTP: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} _ (z moimi własnymi zmiennymi), oraz Otrzymuję następujące: _ <7b225f69 64223a22 35353962 61656165 ..._ – Alfonso

+0

Istnieje wiele sposobów na konwersję NSData na ciąg (lub JSON). Proponuję użyć wyszukiwania tutaj, aby znaleźć jedną z nich. – Travis

0

Po prostu, aby go nieco łatwiej.

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

Dla Swift 3+

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

To naprawdę dobre demo oparte na Swift3.0, działające po mojej stronie. – Kevin