2016-10-05 20 views
5

Được nâng cấp gần đây lên Alamofire 4 và gặp phải một vài sự cố. Tự hỏi cách mã hóa tham số yêu cầu url thành JSON trong Alamofire Router. Dưới đây là ví dụ tôi đã theo dõi trong Alamofire 3.Mã hóa tham số yêu cầu URL Alamofire 4 thành 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 
    } 
} 

Có vẻ như trong Alamofire 4 điều này đã được thay đổi.

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

Đây là những gì tôi đang thử với Bộ định tuyến Alamofire 4, nhưng không hoạt động như mong đợi.

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 

Trả lời

7

tôi sử dụng cú pháp mã hóa này:

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

Trong trường hợp của bạn, nó có thể là như thế này:

let encoding = Alamofire.JSONEncoding.default 

tôi đã phải vật lộn với vấn đề này quá, cho đến khi tôi tìm thấy một đơn giản ví dụ tại đây:

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

+0

Thực ra tôi đã thử điều đó, nhưng đã không chú ý đến lỗi tôi đã nhận được trong xcode. Có vẻ như đối tượng từ điển trên thiết bị của tôi bị tạo thành không đúng do không có khóa thông báo. ["notificationToken": tùy chọn (nil), "deviceId": "6f61f29e-c01b-4010-b587-74b2a0bdf96b"] – user2498258

Các vấn đề liên quan