美文网首页
AFNetworking介绍

AFNetworking介绍

作者: liang1030 | 来源:发表于2022-02-07 14:25 被阅读0次

简介:

AFNetworking是iOS、macOS、watchOS和tvOS的一个令人愉快的网络库。它建立在基础URL加载系统之上,扩展了构建到Cocoa中的强大的网络高级抽象。它有一个模块化的体系结构,具有设计良好、功能丰富的API,使用起来很愉快。

然而,也许最重要的特点是,每天都在使用AFNetworking并为其做出贡献的开发人员组成了一个令人惊叹的社区。AFNetworking为iPhone、iPad和Mac上一些最受欢迎、广受好评的应用提供了动力。

如何开始使用:

• 下载AFNetworking,并试用附带的Mac和iPhone示例应用程序。
• 阅读“入门”指南、常见问题解答或维基上的其他文章。

交流:

• 如果需要帮助,使用"Stack Overflow"(标签 'afnetworking')。
• 如果你想问一个一般性的问题,使用"Stack Overflow"。
• 如果您发现了一个bug,并且能够提供可靠地复现它的步骤,那么就打开一个issue。
• 如果您有特殊请求,请打开一个issue。
• 如果你想贡献,提交一个请求。

安装:

AFNetworking支持在项目中安装库的多种方法。

通过CocoaPods安装:

要使用CocoaPods将AFNetworking集成到Xcode项目中,请在Podfile中指定:

pod 'AFNetworking', '~> 4.0'

通过Swift Package Manager安装:

一旦设置了Swift package,将AFNetworking添加为依赖项与将其添加到Package.swift中的dependencies值一样简单。

dependencies: [
    .package(url: "https://github.com/AFNetworking/AFNetworking.git", .upToNextMajor(from: "4.0.0"))
]

注:AFNetworking的Swift包不包含UIKit扩展。

通过Carthage安装:

Carthage是一个分散的依赖关系管理器,它可以构建您的依赖关系,并为您提供二进制框架。要集成AFNetworking,请将以下内容添加到您的Cartfile文件中。

github "AFNetworking/AFNetworking" ~> 4.0

结构:

NSURLSession

• AFURLSessionManager
• AFHTTPSessionManager

Serialization

• <AFURLRequestSerialization>
° AFHTTPRequestSerializer
° AFJSONRequestSerializer
° AFPropertyListRequestSerializer

• <AFURLResponseSerialization>
° AFHTTPResponseSerializer
° AFJSONResponseSerializer
° AFXMLParserResponseSerializer
° AFXMLDocumentResponseSerializer(macOS)
° AFPropertyListResponseSerializer
° AFImageResponseSerializer
° AFCompoundResponseSerializer

Additional Functionality

• AFSecurityPolicy
• AFNetworkReachabilityManager

使用:

AFURLSessionManager

AFURLSessionManager基于指定的NSURLSessionConfiguration对象创建和管理NSURLSession对象,该对象遵从<NSURLSessionTaskDelegate>、<NSURLSessionDataDelegate>、<NSURLSessionDownloadDelegate>和<NSURLSessionDelegate>。

Creating a Download Task

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];

Creating an Upload Task

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"Success: %@ %@", response, responseObject);
    }
}];
[uploadTask resume];

Creating an Upload Task for a Multi-Part Request, with Progress

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
    } error:nil];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:request
              progress:^(NSProgress * _Nonnull uploadProgress) {
                  // This is not called back on the main queue.
                  // You are responsible for dispatching to the main queue for UI updates
                  dispatch_async(dispatch_get_main_queue(), ^{
                      //Update the progress view
                      [progressView setProgress:uploadProgress.fractionCompleted];
                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error: %@", error);
                  } else {
                      NSLog(@"%@ %@", response, responseObject);
                  }
              }];

[uploadTask resume];

Creating a Data Task

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://httpbin.org/get"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    if (error) {
        NSLog(@"Error: %@", error);
    } else {
        NSLog(@"%@ %@", response, responseObject);
    }
}];
[dataTask resume];

请求序列化

请求序列化程序从URL字符串创建请求,将参数编码为查询字符串或HTTP请求体。

NSString *URLString = @"http://example.com";
NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};

查询字符串参数编码

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];

编码:

GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3

URL表单参数编码

[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];

编码:

POST http://example.com/
Content-Type: application/x-www-form-urlencoded

foo=bar&baz[]=1&baz[]=2&baz[]=3

JSON参数编码

[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];

编码:

POST http://example.com/
Content-Type: application/json

{"foo": "bar", "baz": [1,2,3]}

网络连接性管理

AFNetworkReachabilityManager监控域的可达性,以及WWAN和WiFi网络接口的地址。

• 不要使用可达性来确定是否应该发送原始请求。
° 你应该试着发送它。
• 你可以使用可达性来确定何时应该自动重试请求。
° 尽管仍然可能失败,但连接可用的可达性通知是重试的好时机。
• 网络可达性是确定请求失败原因的有用工具。
° 在网络请求失败后,告诉用户他们处于离线状态比给他们一个更技术但更准确的错误,例如“请求超时”要好。

共享网络可达性

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];

[[AFNetworkReachabilityManager sharedManager] startMonitoring];

安全策略

AFSecurityPolicy通过安全连接根据固定的X.509证书和公钥评估服务器信任。

向应用程序添加固定SSL证书有助于防止中间人攻击和其他漏洞。强烈建议处理敏感客户数据或财务信息的应用程序通过配置并启用SSL固定的HTTPS连接路由所有通信。

允许使用无效的SSL证书

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES; // 不建议用于生产环境

单元测试

AFNetworking在tests子目录中包含一套单元测试。这些测试只需在您想要测试的平台框架上执行测试操作即可运行。

相关文章

网友评论

      本文标题:AFNetworking介绍

      本文链接:https://www.haomeiwen.com/subject/wtcmkrtx.html