2016-10-05 10 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 Routerを試していますが、期待通りに動作しません。

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

関連する問題