1. 程式人生 > >iOS AFNetworking(網路框架)

iOS AFNetworking(網路框架)

NSURLConnection

---匯入標頭檔案"AFHTTPRequestOperationManager.h"

1. 傳送GET請求

//傳送get請求
- (void)get {
    [[AFHTTPRequestOperationManager manager] GET:@"http://127.0.0.1/demo.json" parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
        NSLog(@"%@",responseObject);
        NSLog(@"%@",[responseObject class]);
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

2. 傳送GET請求--帶引數

//傳送get請求,傳引數
- (void)get {
    [[AFHTTPRequestOperationManager manager] GET:@"http://127.0.0.1/php/login.php" parameters:@{@"username":@"abc",@"password":@"123"} success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

3. 傳送POST請求

//演示post請求
- (void)post {
    [[AFHTTPRequestOperationManager manager] POST:@"http://127.0.0.1/php/login.php" parameters:@{@"username":@"abcd",@"password":@"lalala"} success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
        NSLog(@"%@",responseObject);
        
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

4. 上傳檔案

- (void)post {
    //獲取要上傳檔案的路徑
    NSURL *url1 = [[NSBundle mainBundle] URLForResource:@"06.jpg" withExtension:nil];
    NSURL *url2 = [[NSBundle mainBundle] URLForResource:@"01.jpg" withExtension:nil];

    [[AFHTTPRequestOperationManager manager] POST:@"http://127.0.0.1/php/upload/upload-m.php" parameters:@{@"username":@"zhangsan"} constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        //上傳檔案
        [formData appendPartWithFileURL:url1 name:@"userfile[]" error:nil];
        [formData appendPartWithFileURL:url2 name:@"userfile[]" error:nil];

    } success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

NSURLSession

---匯入標頭檔案"AFHTTPSessionManager.h"

1. 傳送GET請求

- (void)get {
    [[AFHTTPSessionManager manager] GET:@"http://127.0.0.1/demo.json" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        NSLog(@"%@",responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

2. 下載任務

- (void)download {
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/abc.hm"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //進度
    NSProgress *progress = nil;
    [[[AFHTTPSessionManager manager] downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//        NSLog(@"targetPath -- %@",targetPath);
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
        // 本地檔案的URL必須使用這種方式獲取
        NSURL *url = [[NSURL alloc] initFileURLWithPath:path];
        //返回要儲存檔案的路徑
        return url;
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        NSLog(@"%@",filePath);
    }] resume];
    
    //觀察progress的某個屬性fractionCompleted(進度)是否發生變化
    //KVO
    [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([object isKindOfClass:[NSProgress class]]) {
//        NSLog(@"%@",change);
        NSProgress *progress = object;
        NSLog(@"%@",progress.localizedDescription);
        NSLog(@"%@",progress.localizedAdditionalDescription);
        NSLog(@"completedUnitCount : %zd",progress.completedUnitCount);
        NSLog(@"totalUnitCount : %zd",progress.totalUnitCount);
        NSLog(@"fractionCompleted : %f",progress.fractionCompleted);

        //回到主執行緒更新UI
        NSLog(@"%@",[NSThread currentThread]);
    }
}

3. 獲取網頁資料--修改預設的序列化器

- (void)getBaidu {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //修改響應的序列化器
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"%@",html);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

4. 解析XML

- (void)getXML {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    // 設定序列號器為XML,也可修改為AFHTTPResponseSerializer,使用第三方框架解析二進位制資料
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

    [manager GET:@"http://127.0.0.1/videos.xml" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, NSXMLParser *responseObject) {
        //解析xml
        responseObject.delegate = self;
        [responseObject parse];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"%@",error);
    }];
}

//NSXMLParser 的代理方法

- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"1 開始解析");
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    NSLog(@"2 開始節點 %@  %@",elementName,attributeDict);
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"3 節點之間的內容 %@",string);
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"4 結束節點 %@",elementName);
}

- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"5 結束解析");
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"6 錯誤");
}