2016-06-15 6 views
0

Ist es möglich, einen Alamofire-Validator zu haben, der die geparste JSON-Antwort erhält, eine Eigenschaft prüft und abhängig von diesem Wert true/false zurückgibt?Validierung der JSON-Antwort mit Alamofire

Ich habe eine API, die immer 200 Antwortcodes zurückgibt, aber die Antwort hat eine Erfolgseigenschaft.

Ich möchte diese Eigenschaft überprüfen, bevor der responseJSON-Rückruf ausgelöst wird und nur responseJSON aufrufen, wenn success == true.

Ist dies mit benutzerdefinierten Validatoren möglich?

+0

Dies ist eine unglaublich einfache Sache zu erreichen innerhalb des Erfolgs Handler zu sein scheint - orthogonal zu einer zugrunde liegenden Netzwerkbibliothek. Sie können dies zu einem One-Liner machen. – CouchDeveloper

Antwort

0

Ich glaube nicht, dass es ist. Validatorblöcke erhalten die Antwortdaten nicht als Argumente, nur als Header und dergleichen.

+0

OK. Vielleicht muss ich meine eigene Version von responseJSON schreiben. –

+0

Validator Blöcke ** do ** erhalten die Antwortdaten. Siehe https://github.com/Alamofire/Alamofire/blob/a502949e2d64ac8e15cdbf7fa5353c39bc7cd10e/Source/Validation.swift#L164 –

3

Eine Lösung gefunden, mit der ich mich gut fühle. Zuerst habe ich Erweiterungsmethoden erstellt, die nach Fehlern suchen und die Daten extrahieren, an denen ich interessiert bin. Ich habe einen Erfolgsrückruf und einen Fehlerrückruf.

import Foundation 
import Alamofire 

extension Request { 
    public func apiSuccess(
      queue queue: dispatch_queue_t? = nil, 
      options: NSJSONReadingOptions = .AllowFragments, 
      completionHandler: [String:AnyObject] -> Void) 
        -> Self 
    { 
     return response(
     queue: queue, 
       responseSerializer: Request.JSONResponseSerializer(options: options), 
       completionHandler: { response in 
        if let jsonValue = response.result.value as? [String:AnyObject] { 
         let success = jsonValue["success"] as! Bool 
         if (success) { 
          completionHandler(jsonValue["object"] as! [String:AnyObject]) 
         } 
        } 
       } 
     ) 
    } 

    public func apiError(
     queue queue: dispatch_queue_t? = nil, 
       options: NSJSONReadingOptions = .AllowFragments, 
       completionHandler: [String] -> Void) 
     -> Self 
    { 
     return response(
      queue: queue, 
      responseSerializer: Request.JSONResponseSerializer(options: options), 
      completionHandler: { response in 
       if let jsonValue = response.result.value as? [String:AnyObject] { 
        let success = jsonValue["success"] as! Bool 
        if (!success) { 
         let errorDict = jsonValue["errors"] as! [String:[String]] 
         var errors : [String] = [] 
         errorDict.keys.forEach { key in 
          errors += errorDict[key] as [String]! 
         } 

         completionHandler(errors) 
        } 
       } 
      } 
     ) 
    } 
} 

Dann kann ich es wie folgt verwendet werden:

Alamofire.request(.POST, url, 
      parameters: parameters, 
      encoding: .JSON) 
      .apiSuccess { response in 
       print("Success Callback", response) 
      } 
      .apiError { errors in 
       print("Errors ", errors) 
     }