2016-09-19 19 views
9

Tôi cập nhật dự án của mình lên Swift 3 và Alamofire 4. Tôi đã sử dụng Mã hóa tùy chỉnh, nhưng nó đã thay đổi thành các phương thức mã hóa khác. Tôi không thể tìm thấy giải pháp thay thế/tương đương như sau:Alamofire 4 Swift 3 ParameterEncoding Tùy chỉnh

alamoFire.request(urlString, method: HTTPMethod.post, parameters: [:], encoding: .Custom({ 
     (convertible, params) in 

     let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest 
     let data = (body as NSString).data(using: String.Encoding.utf8) 
     mutableRequest.httpBody = data 
     return (mutableRequest, nil) 

    }), headers: headers()).responseJSON { (responseObject) -> Void in 

     switch responseObject.result { 
     case .success(let JSON): 
      success(responseObject: JSON) 

     case .failure(let error): 
      failure(error: responseObject) 
     } 
    } 

Tôi cũng đã cố gắng bằng cách làm cho đối tượng URLRequest và yêu cầu đơn giản của nó cũng đem lại cho tôi lỗi

var request = URLRequest(url: URL(string: urlString)!) 
    let data = (body as NSString).data(using: String.Encoding.utf8.rawValue) 
    request.httpBody = data 
    request.httpMethod = "POST" 
    request.allHTTPHeaderFields = headers() 

    alamoFire.request(request).responseJSON { (responseObject) -> Void in 

     switch responseObject.result { 
     case .success(let JSON): 
      success(JSON) 

     case .failure(let error): 
      failure(responseObject, error) 
     } 
    } 

Đừng chỉ cho tôi một số hướng, làm thế nào để đính kèm httpbody với Alamofire 4

+0

Có gì trong cơ thể bạn? Bạn chắc chắn rằng nó chuyển đổi thành một String? Và bạn muốn gửi nó như thế nào? dưới dạng JSON? hoặc chỉ là một String? –

+0

@AlvinVarghese Dữ liệu thô –

Trả lời

11

Trong Alamofire 4.0, bạn nên sử dụng giao thức ParameterEncoding. Dưới đây là ví dụ, làm cho bất kỳ mã nào StringUTF8 được mã hóa.

extension String: ParameterEncoding { 

    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
     var request = try urlRequest.asURLRequest() 
     request.httpBody = data(using: .utf8, allowLossyConversion: false) 
     return request 
    } 

} 

Alamofire.request("http://mywebsite.com/post-request", method: .post, parameters: [:], encoding: "myBody", headers: [:]) 
+0

cách mã hóa: "myBody" liên quan đến bất kỳ mã nào khác trong ví dụ này? câu trả lời này là chưa hoàn thành mặc dù chấp nhận. – CptEric

+0

"myBody" chỉ là một chuỗi mẫu, thể hiện phần thân yêu cầu của bạn. Theo mặc định, bạn không thể sử dụng 'String' như tham số' coding', nhưng với sự trợ giúp của 'extension' trong ví dụ của tôi, bạn có thể. – Silmaril

+0

Thú vị. Nên có một cách thanh lịch hơn để cung cấp một mã hóa thô hơn mở rộng lớp String, nhờ phản hồi nhanh của bạn. – CptEric

8

Thử phương pháp này?

Alamofire.request(url, method: HTTPMethod.post, parameters: parameters, encoding: URLEncoding.httpBody, headers: nil).responseObject(completionHandler: { (response : DataResponse<T>) in 

}) 
+0

Đây phải là câu trả lời được chấp nhận vì không yêu cầu triển khai tùy chỉnh 'ParameterEncoding' – mosn

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