Ios URLSession函数类似于Alamofire';什么是责任预算?
因为我使用的是cocoapods,并且有必要的Objective-C依赖关系,所以我不能使用框架,因此也不能使用Alamofire。。。Alamofire有一个函数responseString(见下面的代码),所以我需要使用URLSession以本机方式完成这项工作,我如何才能做到这一点Ios URLSession函数类似于Alamofire';什么是责任预算?,ios,swift,nsurlsession,Ios,Swift,Nsurlsession,因为我使用的是cocoapods,并且有必要的Objective-C依赖关系,所以我不能使用框架,因此也不能使用Alamofire。。。Alamofire有一个函数responseString(见下面的代码),所以我需要使用URLSession以本机方式完成这项工作,我如何才能做到这一点 Alamofire.request(testURL).responseString { response in print("\(response.result.isSuccess)")
Alamofire.request(testURL).responseString { response in
print("\(response.result.isSuccess)")
if let html = response.result.value {
parseHTML(html: html)
}
}
阿拉莫菲尔:
extension DataRequest {
/// Creates a response serializer that returns a result string type initialized from the response data with
/// the specified string encoding.
///
/// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server
/// response, falling back to the default HTTP default character set, ISO-8859-1.
///
/// - returns: A string response serializer.
public static func stringResponseSerializer(encoding: String.Encoding? = nil) -> DataResponseSerializer<String> {
return DataResponseSerializer { _, response, data, error in
return Request.serializeResponseString(encoding: encoding, response: response, data: data, error: error)
}
}
/// Adds a handler to be called once the request has finished.
///
/// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the
/// server response, falling back to the default HTTP default character set,
/// ISO-8859-1.
/// - parameter completionHandler: A closure to be executed once the request has finished.
///
/// - returns: The request.
@discardableResult
public func responseString(
queue: DispatchQueue? = nil,
encoding: String.Encoding? = nil,
completionHandler: @escaping (DataResponse<String>) -> Void)
-> Self
{
return response(
queue: queue,
responseSerializer: DataRequest.stringResponseSerializer(encoding: encoding),
completionHandler: completionHandler
)
}
}
扩展数据请求{
///创建一个响应序列化程序,该序列化程序返回从具有
///指定的字符串编码。
///
///-参数编码:字符串编码。如果为“nil”,则字符串编码将由服务器确定
///响应,返回默认HTTP默认字符集ISO-8859-1。
///
///-返回:字符串响应序列化程序。
公共静态函数stringResponseSerializer(编码:String.encoding?=nil)->DataResponseSerializer{
返回DataResponseSerializer{},响应,数据,中的错误
返回请求.serializeResponseString(编码:编码,响应:响应,数据:数据,错误:错误)
}
}
///添加请求完成后要调用的处理程序。
///
///-参数编码:字符串编码。如果为“nil”,则字符串编码将根据
///服务器响应,返回默认HTTP默认字符集,
///ISO-8859-1。
///-参数completionHandler:请求完成后执行的闭包。
///
///-返回:请求。
@可丢弃结果
公共职能负责人(
队列:DispatchQueue?=nil,
编码:字符串。编码?=nil,
completionHandler:@escaping(DataResponse)->Void)
->自我
{
返回响应(
队列:队列,
responseSerializer:DataRequest.stringResponseSerializer(编码:编码),
completionHandler:completionHandler
)
}
}
从响应中获取数据,将其转换为字符串。阿拉莫菲尔在这里没什么作用
public static func serializeResponseString(
encoding: String.Encoding?,
response: HTTPURLResponse?,
data: Data?,
error: Error?)
-> Result<String>
{
guard error == nil else { return .failure(error!) }
if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success("") }
guard let validData = data else {
return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))
}
var convertedEncoding = encoding
if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil {
convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(
CFStringConvertIANACharSetNameToEncoding(encodingName))
)
}
let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1
if let string = String(data: validData, encoding: actualEncoding) {
return .success(string)
} else {
return .failure(AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding)))
}
}
公共静态函数序列化responseString(
编码:字符串。编码?,
响应:HTTPURLResponse?,
数据:数据?,
错误:错误?)
->结果
{
guard error==nil else{return.failure(error!)}
如果let response=response,则emptyDataStatusCodes.contains(response.statusCode){return.success(“”)}
guard let validData=数据其他{
return.failure(AFError.responseSerialization失败(原因:.inputDataNil))
}
var convertedEncoding=编码
如果让encodingName=response?.textEncodingName为CFString!,则convertedEncoding==nil{
convertedEncoding=String.Encoding(原始值:CFStringConvertEncodingTonsStringCodeing(
CFSTRINGCONVERTIANACHARSETNAME编码(编码名称))
)
}
让actualEncoding=convertedEncoding??String.Encoding.isoLatin1
如果let string=string(数据:validData,编码:actualEncoding){
return.success(字符串)
}否则{
return.failure(AFError.responseSerializationFailed(原因:.stringSerializationFailed(编码:actualEncoding)))
}
}
从URLSessionDataTask
获取成功
和value/html
值的基本代码是
dataTask(url: url) { (data, response, error) in
guard error == nil else {
print(error!)
// handle error
return
}
let success : Bool
let html : String
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
success = true
html = String(data:data!, encoding: .utf8)! // or .isoLatin1
} else {
success = false
print("http response error")
html = ""
}
print(html, success)
}
它采用标准文本编码(utf8)。而
URLRequest
仅用于POST
请求。此代码到底在做什么?只需执行对testURL的请求,然后从响应中获取html数据部分?能否更明确地说明不能使用Alamofire的原因?我在cocoapods和objc依赖项中使用过它。在与cocoapods的混合项目中使用Alamofire从来没有遇到过问题(事实上,Alamofire本身就是一个pod)。没有问题,使用框架会破坏我现有的pod(即Pinterest SDK)我已经在Alamofirethanks中添加了方法中的文档,但是它在html=String(数据:data!,编码:.utf8)上崩溃了代码>确定此行正确吗?(我知道url是可以的…)代码未经测试,但它应该可以工作。数据是否为utf8
?当你打印数据时,你得到了预期的字节数吗?如果代码在这一行崩溃,编码不匹配。我想就是这样,我的请求是谷歌我应该使用什么编码?我更新了答案,以提供windows/latin作为替代。您可以从响应的标题(内容类型
)获取编码。