2016-10-05 3 views
5

최근에 Alamofire 4로 업그레이드되어 몇 가지 문제가 있습니다. Alamofire Router의 JSON에 URL 요청 매개 변수를 인코딩하는 방법을 알고 싶습니다. 여기에 내가Alamofire 4 URL JSON에 매개 변수 인코딩 요청

enum UserRouter: URLRequestConvertible { 
    static let baseURLString = "http://jsonplaceholder.typicode.com/" 

    case Get(Int) 
    case Create([String: AnyObject]) 
    case Delete(Int) 

    var URLRequest: NSMutableURLRequest { 
    var method: Alamofire.Method { 
     switch self { 
     case .Get: 
     return .GET 
     case .Create: 
     return .POST 

     } 
    } 

    let params: ([String: AnyObject]?) = { 
     switch self { 
     case .Get: 
     return (nil) 
     case .Create(let newPost): 
     return (newPost) 
     } 
    }() 

    let url:NSURL = { 
     let relativePath:String? 
     switch self { 
     case .Get(let postNumber): 
     relativePath = "posts/\(postNumber)" 
     case .Create: 
     relativePath = "posts" 
     } 

     var URL = NSURL(string: PostRouter.baseURLString)! 
     if let relativePath = relativePath { 
     URL = URL.URLByAppendingPathComponent(relativePath) 
     } 
     return URL 
    }() 

    let URLRequest = NSMutableURLRequest(URL: url) 

    let encoding = Alamofire.ParameterEncoding.JSON 
    let (encodedRequest, _) = encoding.encode(URLRequest, parameters: params) 

    encodedRequest.HTTPMethod = method.rawValue 

    return encodedRequest 
    } 
} 

그것은 지금 Alamofire 4이 변경되었습니다 보인다 Alamofire 3에 다음의 한 예이다.

let encoding = Alamofire.ParameterEncoding.JSON 
let (encodedRequest, _) = encoding.encode(URLRequest, parameters: params) 

여기는 Alamofire 4 라우터로 시도하고 있지만 예상대로 작동하지 않습니다.

func asURLRequest() throws -> URLRequest { 
     let url = try UserRouter.baseURLString.asURL() 

     var urlRequest = URLRequest(url: url.appendingPathComponent(path)) 
     urlRequest.httpMethod = method.rawValue 


     switch self { 
      case .updateDeviceToken(_,let device): 
       urlRequest = try ParameterEncoding.encode(urlRequest as URLRequestConvertible, with: device) 
       //urlRequest = try JSONEncoding.default.encode(urlRequest, with: device) 
      case .addUser(_, let user): 
       urlRequest = try URLEncoding.default.encode(urlRequest, with: user) 
      case .updateUser(_,_,let user): 
       urlRequest = try URLEncoding.default.encode(urlRequest, with: user) 
      case .lockUser(_,_,let user): 
       urlRequest = try URLEncoding.default.encode(urlRequest, with: user) 
      default: 
       break 
     } 
     return urlRequest 

답변

7

내가이 인코딩 구문을 사용합니다 : 귀하의 경우

... 
method: .get, 
parameters: parameters, 
encoding: JSONEncoding.default, 
headers: nil, 
... 

를,이처럼 될 수있다 : 나도이 문제로 어려움을 겪고 있었다

let encoding = Alamofire.JSONEncoding.default 

, 나는 간단한을 발견 할 때까지 여기에 예 :

https://github.com/Alamofire/Alamofire#json-encoding

+0

사실 나는 그것을 시도했지만 xcode에 오류가 발생했다는 것에 주목하지 않았습니다. notificationToken 키에 nil로 인해 장치 사전 객체가 잘못 작성 된 것으로 보입니다. [ "notificationToken": 선택 사항 (nil), "deviceId": "6f61f29e-c01b-4010-b587-74b2a0bdf96b"] – user2498258