ios 如何使用 Alamofire 4 SessionManager?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/39625362/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to use Alamofire 4 SessionManager?
提问by yasin
I was using Alamofire 3.4 in Swift 2.3 and I need to update my code to Swift 3 and Alamofire 4. I was using Alamofire's Manager to do a POST in a url. I read the documentation about SessionManager and I understand that the request uses the method .GET.
我在 Swift 2.3 中使用 Alamofire 3.4,我需要将我的代码更新为 Swift 3 和 Alamofire 4。我使用 Alamofire 的管理器在 url 中执行 POST。我阅读了有关 SessionManager 的文档,我知道该请求使用了 .GET 方法。
I was using Manager .Response() to get the callback from the request, now that's changed in SessionManager.
我正在使用 Manager .Response() 从请求中获取回调,现在它在 SessionManager 中发生了变化。
How do I make a POST method using SessionManager? And how do I get the response from the request?
如何使用 SessionManager 制作 POST 方法?以及如何从请求中获得响应?
This is my original code:
这是我的原始代码:
import UIKit
import AEXML
import Alamofire
class Request: NSObject {
internal typealias RequestCompletion = (statusCode: Int?, error:NSError?) -> ()
private var completionBlock: RequestCompletion!
var serverTrustPolicy: ServerTrustPolicy!
var serverTrustPolicies: [String: ServerTrustPolicy]!
var afManager: Manager!
func buildBdRequest(ip : String, serviceStr : String, completionBlock:RequestCompletion){
let url = getURL(ip, service: serviceStr)
configureAlamoFireSSLPinningWithCertificateData()
makeAlamofireRequest(url)
self.completionBlock = completionBlock
}
func makeAlamofireRequest(url : String){
self.afManager.request(.POST, url)
.validate(statusCode: 200..<300)
.response { request, response, data, error in
print("data - > \n \(data.debugDescription) \n")
print("response - >\n \(response.debugDescription) \n")
print("error - > \n \(error.debugDescription) \n")
var statusCode = 0
if response != nil {
statusCode = (response?.statusCode)!
}
self.completionBlock(statusCode: statusCode, error: error)
}
}
private func getURL(ip : String, service: String) -> String{
return ip + service;
}
func configureAlamoFireSSLPinningWithCertificateData() {
self.serverTrustPolicies = [ :
// "github.com": self.serverTrustPolicy!
]
self.afManager = Manager(
configuration: NSURLSessionConfiguration.defaultSessionConfiguration()
)
}
}
采纳答案by kamwysoc
I've migrated your code to Swift 3 and Alamofire 4 and here it's a result :
我已将您的代码迁移到 Swift 3 和 Alamofire 4,结果如下:
internal typealias RequestCompletion = (Int?, Error?) -> ()?
private var completionBlock: RequestCompletion!
var afManager : SessionManager!
func makeAlamofireRequest(url :String){
let configuration = URLSessionConfiguration.default
afManager = Alamofire.SessionManager(configuration: configuration)
afManager.request(url, method: .post).validate().responseJSON {
response in
switch (response.result) {
case .success:
print("data - > \n \(response.data?.debugDescription) \n")
print("response - >\n \(response.response?.debugDescription) \n")
var statusCode = 0
if let unwrappedResponse = response.response {
let statusCode = unwrappedResponse.statusCode
}
self.completionBlock(statusCode, nil)
break
case .failure(let error):
print("error - > \n \(error.localizedDescription) \n")
let statusCode = response.response?.statusCode
self.completionBlock?(statusCode, error)
break
}
}
}
Some notes about code:
关于代码的一些注意事项:
In Alamofire 4.0 you don't need to manually validate between codes 200..300. validate()
method do it automatically.
在 Alamofire 4.0 中,您不需要在代码 200..300 之间手动验证。validate()
方法自动执行。
文件:
Automatically validates status code within 200...299 range, and that the Content-Type header of the response matches the Accept header of the request if one is provided.
自动验证 200...299 范围内的状态代码,并且响应的 Content-Type 标头与请求的 Accept 标头匹配(如果提供)。
You can use response
parameter in responseJSON
method. It contains all information that you need in your code.
您可以response
在responseJSON
方法中使用参数。它包含您在代码中需要的所有信息。
About request
method
关于request
方法
open func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest
open func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest
All parameters except URL, are initially nil or has a default value. So it's no problem to add parameters or headers to your request.
除了 URL 之外的所有参数最初都是 nil 或具有默认值。因此,向您的请求添加参数或标头是没有问题的。
Hope it helps you
希望对你有帮助