2016-10-05 15 views
5

Geçtiğimiz günlerde Alamofire 4'e yükseltildi ve birkaç sorunla karşılaştı. Alamofire Router'da url istek parametresinin JSON'a nasıl kodlanacağını merak ediyorum. Aşağıda, Alamofire 3'de izlediğim örnek verilmiştir.Alamofire 4 URL İstek parametresini kodlayan 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 
    } 
} 

Şimdi Alamofire 4'de bu durum değişti.

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

Burada, Alamofire 4 Router ile çalıştığım, ancak beklendiği gibi çalışmıyor.

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 

cevap

7

Bu kodlama sözdizimini kullanın: Senin durumunda

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

, bu gibi olabilir: Ben de bu konuda mücadele eden

let encoding = Alamofire.JSONEncoding.default 

, basit bulana kadar örnek burada:

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

+0

Aslında bunu denedim, ancak xcode'a girdiğim hataya dikkat etmedim. Görünüşe göre benim aygıt sözlük nesnesi, notificationToken anahtarında sıfırdan dolayı kötü şekilde oluşturuldu. ["notificationToken": isteğe bağlı (nil), "deviceId": "6f61f29e-c01b-4010-b587-74b2a0bdf96b"] – user2498258

İlgili konular