2016-06-15 3 views
0

Alamofire 유효성 검사기를 사용하여 구문 분석 된 JSON 응답을 받고 속성을 확인한 다음 해당 값에 따라 true/false를 반환 할 수 있습니까?Alamofire로 JSON 응답 유효성 검사

응답 코드는 항상 200이지만 응답에는 success 속성이 있습니다.

responseJSON 콜백이 시작되기 전에이 속성을 확인하고 success == true 인 경우에만 responseJSON을 호출하고 싶습니다.

맞춤 검사기로이 작업을 수행 할 수 있습니까?

+0

이 성공 핸들러 내에서 수행 할 수있는 놀라운 간단한 일이 될 것 같다 - 어떤 기본 네트워크 라이브러리 직교. 이걸 하나의 라이너로 만들 수 있습니다. – CouchDeveloper

답변

0

나는 생각하지 않습니다. 검사기 블록은 응답 데이터를 인수로, 헤더 만 수신합니다.

+0

확인. 아마 나는 자기 자신의 버전 인 responseJSON을 써야 할 것이다. –

+0

검사기 블록 **은 응답 데이터를 수신합니다 **. https://github.com/Alamofire/Alamofire/blob/a502949e2d64ac8e15cdbf7fa5353c39bc7cd10e/Source/Validation.swift#L164를 참조하십시오. –

3

해결책을 찾았습니다. 먼저 오류를 확인하고 내가 관심있는 데이터를 추출하는 확장 메서드를 만들었습니다. 하나의 성공 콜백과 하나의 오류 콜백이 있습니다.

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

그럼 다음과 같이 사용할 수 있습니다 :

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