2016-09-24 28 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

感谢您的回答。请使用您的代码提供更多信息。 –