2016-09-24 11 views
7

kłopoty z dostaniem głowę wokół kodowania parametrów w Alamofire 4. Przed chciałbym użyć ParameterEncoding wyliczanie i zrobić coś takiego:Jak wykonać kodowanie parametrów w Alamofire 4?

Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0 

Jednak od tego czasu została zastąpiona ParameterEncoding :

public typealias Parameters = [String: Any] 

public protocol ParameterEncoding { 
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest 
} 

Jak mogę połączyć to z moim bieżącym kodem? Jak zakodować mój bieżący numer mutableURLRequest?

EDIT:

static func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, Any>, data:Data?, contentType: ContentType, parameterName: String) -> (URLRequestConvertible, Data) { 

     var urlRequest = URLRequest(url: URL(string: urlString)!) 
     urlRequest.cachePolicy = .reloadIgnoringLocalCacheData 
     urlRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue 
     let boundaryConstant = "multipart-boundary"; 
     let multipartContentType = "multipart/form-data;boundary="+boundaryConstant 
     urlRequest.setValue(multipartContentType, forHTTPHeaderField: "Content-Type") 

     // Create upload data to send 
     var uploadData = Data() 

     if data != nil { 
      // Add multipart data 
      uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) 
      if contentType == .Image_JPEG { 
       uploadData.append("Content-Disposition: form-data; name=\"\(parameterName)\"; filename=\"file.jpeg\"\r\n".data(using: String.Encoding.utf8)!) 
       uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!) 
      } else if contentType == .Audio { 
       let dateFormatter = DateFormatter() 
       dateFormatter.dateFormat = "MMyyyyddsshhmmA" // superset of OP's format 
       let audioFileName = "recording-\(dateFormatter.string(from: Date())).mp4" 
       uploadData.append("Content-Disposition: form-data; name=\"\(parameterName)\"; filename=\"\(audioFileName)\"\r\n".data(using: String.Encoding.utf8)!) 
       uploadData.append("Content-Type: audio/mpeg\r\n\r\n".data(using: String.Encoding.utf8)!) 
      } 
      uploadData.append(data!) 
     } 

     // Add parameters 
     for (key, value) in parameters { 
      uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) 
      uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!) 
     } 
     uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!) 

     // return URLRequestConvertible and Data 
     return (urlRequest, uploadData) 
    } 

Podczas prośbę:

let urlRequest = urlRequestWithComponents(urlString: url, parameters: parameters, data: imageData, contentType: .Image_JPEG, parameterName: "question_img") 


    alamoManager.upload(urlRequest.1, with: urlRequest.0).responseObject { (response: DataResponse<CustomResponse>) in 

    //Some code 
    } 
+0

Znalazłeś rozwiązanie proszę? – Sam

Odpowiedz

14

Można zrobić prosty Alamofire żądania takiego.

import Alamofire 
import AlamofireObjectMapper 
import ObjectMapper 

// 
// 

Alamofire.request("hello.com", method: .post, parameters: ["name": "alvin"], encoding: JSONEncoding.default, headers: nil).responseObject(completionHandler: { (response : DataResponse<YourModelHere>) in 


}) 

Możesz zobaczyć, że użyłem JSONEncoding w tym żądaniu. Możesz wybrać sposób kodowania w tym miejscu z dowolnego z nich.

W JSONEncoding

  1. domyślnie

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)

  2. Ładnie

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding. prettyPrinted)

I URLEncoding

  1. domyślne -

    Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)

  2. methodDependent

    Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))

  3. queryString

  4. httpBody

    Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody)

i tworzyć własne Custom Encoding takiego.

public struct MyCusomEncoding: ParameterEncoding { 

    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 

     var urlRequest = try urlRequest.asURLRequest() 

     guard let parameters = parameters else { return urlRequest } 

     do { 

      let data = // 

      // Do your custom stuff here, convert your parameters it into JSON, String, Something else or may be encrypted... 

     urlRequest.httpBody = data 

     } catch { 
      throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) 
     } 

     return urlRequest 
    } 
} 

i można korzystać MyCusomEncoding w swoim Alamofire żądań.

+0

Dzięki za bardzo szczegółową odpowiedź. Nadal jestem trochę zdezorientowany. Zmieniłem moje pytanie, aby uwzględnić metodę 'urlRequestWithComponents'. Używam tego do skonstruowania 'URLRequest' przed przesłaniem. Czy to by wymagało kodowania? Jeśli tak, jaki typ? Nie widzę też nigdzie możliwości włączenia "kodowania" w metodzie wysyłania. – KexAri

+2

możesz podać przykład użycia 'MyCusomEncoding' z' Alamofire'? –

+0

Chciałbym również zobaczyć przykład użycia 'MyCusomEncoding'. –

0

Użyj Alamofire.URLEncoding()

Przykład kodu:

// finalRequest: URLRequest? = Nil

do { 
     try finalRequest = Alamofire.URLEncoding().encode(urlRequest as! URLRequestConvertible, with: parameters) 
    } catch { 
     //Handle error 
    } 
    return finalRequest! 
+0

To faktycznie zadziałało dla mnie. Próbowałem różnych odpowiedzi od stackoverflow i to działało na magię. Dzięki! – user

0
do { 
    let alamofireRequest = try Alamofire.URLEncoding().encode(urlRequest as URLRequestConvertible, with: parameters) 
    Alamofire.request(alamofireRequest).response { (dataResponse) in 

    } 
} catch { 

} 
+0

Dzięki za odpowiedź. proszę podać więcej informacji swoim kodem. –