web-dev-qa-db-fra.com

Imprimer le corps de la demande Alamofire

J'utilise la bibliothèque Alamofire pour me connecter à une API dans iOs. J'ai un problème avec l'une des connexions et je ne sais pas si c'est à cause des données encodées dans le corps ou de quelque chose d'autre. Afin de détecter mon erreur, j'essaie d'imprimer dans la console le corps de la demande afin de vérifier si j'envoie la structure de données correcte.

Mon code est le suivant:

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

L'utilisateur est un objet mappable, car j'utilise ObjectMapper combiné à Alamofire. Utilisateur est défini par le code suivant:

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

Le média est défini comme Utilisateur, mais avec des variables différentes.

De plus, j'aimerais savoir, en plus du corps de la demande d'impression, si je pouvais inclure les paramètres de la demande Alimofire de manière plus efficace (quelque chose comme l'analyse de l'objet utilisateur et sa substitution à la variable de paramètres).

Une idée de mes problèmes?

MODIFIER:

Suite à la suggestion de @Travis, j'ai finalement trouvé la solution pour imprimer le corps de la requête. Ci-dessous vous pouvez trouver le code:

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

Pour passer en paramètre un objet que je ne pouvais pas travailler, j'ai suivi la documentation officielle, mais je pouvais le faire.

14
Alfonso

La réponse à votre première question est,

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

En ce qui concerne votre deuxième question, il y a toute une section sur l'abstraction des paramètres API ainsi que sur CRUD et l'autorisation sur la page principale Alamofire .

9
Travis

Pour Swift 3+

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

Ajout de l'extension ci-dessous pour la classe Request pour l'impression des journaux.

extension Request {
    public func debugLog() -> Self {
        #if DEBUG
            debugPrint("=======================================")
            debugPrint(self)
            debugPrint("=======================================")
        #endif
        return self
    }
}

Pour utiliser l'extension, utilisez simplement debugLog () après avoir défini votre requête, comme suit: 

Alamofire.request(url).debugLog()
            .responseJSON( completionHandler: { response in
   })

uRL de référence: link

2
Kartheek

Juste pour que ce soit un peu plus facile.

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