2016-09-24 54 views
7

遇到了麻煩我的周圍參數編碼頭Alamofire 4之前,我會用ParameterEncoding枚舉和做這樣的事情:如何在Alamofire 4中進行參數編碼?

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

但是這已經被替換爲ParameterEncoding

public typealias Parameters = [String: Any] 

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

我怎樣才能將這個融入我當前的代碼?我如何編碼我目前的mutableURLRequest

編輯:

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

在做一個請求:

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

你找到一個解決方案嗎? – Sam

回答

14

你可以做一個簡單的Alamofire要求這樣。

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 


}) 

您可以看到我在此請求中使用了JSONEncoding。你可以從中選擇你的編碼方式。

JSONEncoding

  1. 默認

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

  2. prettyPrinted

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

而且在URLEncoding

  1. 默認 -

    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)

並創建自己的Custom Encoding這樣。

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 
    } 
} 
Alamofire請求

你也可以使用MyCusomEncoding

+0

感謝您的詳細解答。我仍然有點困惑。我編輯了我的問題以包含'urlRequestWithComponents'方法。我在上傳之前使用它來構造'URLRequest'。這甚至需要編碼?如果是這樣的話?我也看不到在上傳方法中包含'encoding'的任何地方。 – KexAri

+2

你能給我一個如何在'Alamofire'上使用'MyCusomEncoding'的例子嗎? –

+0

我也希望看到一個如何使用MyCusomEncoding的例子。 –

0

使用Alamofire。URL編碼()

代碼示例:

// finalRequest:的URLRequest? =零

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

這實際上爲我工作。我一直在嘗試從stackoverflow的各種答案,這有效的魔術。謝謝! – user

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

    } 
} catch { 

} 
+0

感謝您的回答。請使用您的代碼提供更多信息。 –