2016-09-19 2 views
9

Я обновил свой проект до Swift 3 и Alamofire 4. Я использовал настраиваемое кодирование, но оно было изменено на другие методы кодирования. Я не в состоянии найти альтернативу/эквивалентно следующему:Alamofire 4 Swift 3 ParameterEncoding Custom

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) 
     } 
    } 

Я также попытался, сделав URLRequest объекта и простой запрос его также дает мне ошибку

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) 
     } 
    } 

ли мне точку в каком-то направлении, как для прикрепления httpbody с помощью Alamofire 4

+0

Что имеется в вашем теле? Вы уверены, что он преобразуется как строка? И как вы хотите отправить его? как JSON? или как строка? –

+0

@AlvinVarghese Исходные данные –

ответ

11

В Alamofire 4.0 вы должны использовать протокол ParameterEncoding. Вот пример, который делает любое кодирование StringUTF8.

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

Как это работает: «myBody» относится к любому другому коду в этом примере? этот ответ не завершен, хотя принято. – CptEric

+0

«myBody» - это просто примерная строка, представляющая тело вашего запроса. По умолчанию вы не можете использовать 'String' как параметр' coding', но с помощью 'extension' в моем примере вы можете. – Silmaril

+0

Интересно. Должен быть более элегантный способ обеспечения необработанного подбора, чем расширение класса String, благодаря вашему быстрому реагированию. – CptEric

8

Попробуйте этот метод?

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

}) 
+0

Это должен быть принятый ответ, так как не требует специальной реализации 'ParameterEncoding' – mosn

Смежные вопросы