2015-07-15 21 views
9

Ich benutze Alamofire-Bibliothek für die Verbindung mit einer API in iOs. Ich habe ein Problem in einer der Verbindung, und ich weiß nicht, ob es wegen der Daten in den Körper oder eine andere Sache codiert ist. Um meinen Fehler zu erkennen, versuche ich in der Konsole den Anfragetext zu drucken, um zu prüfen, ob ich die richtige Datenstruktur sende.Drucken Alamofire Anfrage Körper

Mein Code ist folgende:

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 ist ein Mappable Objekt, da ich verwende ObjectMapper kombiniert mit Alamofire. Der Benutzer wird durch den folgenden Code definiert:

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

Medien ist wie Benutzer definiert, aber mit verschiedenen Variablen.

Außerdem würde Ich mag wissen, zusätzlich von Druckanfrag Körper, wenn ich die Parameter auf Alimofire Anfrage auf eine effizientere Art und Weise (so etwas wie Parsen das Benutzerobjekts und es für die Parameter variable Substitution) umfassen könnte

Irgendeine Idee über meine Probleme?

EDIT:

Anregung von @Travis Folgen, schließlich fand ich die Lösung, die die Anfrage Körper für den Druck. Im Folgenden finden Sie den Code gefunden:

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

Über vorbei als Parameter ein Objekt, das ich nicht arbeiten konnte, folgte ich die offizielle Dokumentation, aber ich konnte es tun.

+0

Für die Protokollierung Request/Response ist: https://github.com/konkab/AlamofireNetworkActivityLogger – neoneye

Antwort

7

Die Antwort auf Ihre erste Frage ist,

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

Was Ihre zweite Frage geht, gibt es einen ganzen Abschnitt über API Parameter Abstraktion sowie CRUD & Authorization auf den Alamofire main page.

+1

Vielen Dank für Ihre Antwort, aber request.HTTBody Rückkehr NSData-Objekt, und ich kann nicht wissen, ob es die Zeichenfolge ist, die ich erwarte. Ich erwarte etwas wie folgt: _ // HTTP-Körper: {"foo": [1, 2, 3], "bar": {"baz": "qux"}} _ (mit meinen eigenen Variablen), und Ich erhalte Folgendes: _ <7b225f69 64223a22 35353962 61656165 ..._ – Alfonso

+0

Es gibt unzählige Möglichkeiten, NSData in einen String (oder JSON) zu konvertieren. Ich würde vorschlagen, die Suche hier zu verwenden, um einen von ihnen zu finden. – Travis

0

Nur um es ein bisschen einfacher zu machen.

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

Für Swift 3+

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

Das ist wirklich eine gute Demo basierend auf Swift3.0, es funktioniert auf meiner Seite. – Kevin

Verwandte Themen