AFHTTPSessionManager 的使用方法


最近對

最近使用AFNetworking和后台進行交互。使用的請求包含POST PUT GET其中前兩種的因為參數的原因苦苦追尋很久。現在就來總結一下:

先上代碼

-(void)getUserHeadicon:(NSString*) headiconURL{
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/plain",@"application/json", @"text/json", @"text/javascript" ,@"image/jpeg",nil];
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"filename"] = headiconURL;//[headiconURL stringByAppendingString:@".jpg"];
    [manager POST: [[NSString stringWithFormat:@"http://example.com/download"] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"#%^{}\"[]|\\<> "].invertedSet] parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSLog(@"請求用戶頭像成功");
        self.Headicon_login.image = [UIImage imageWithData:responseObject];

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"請求失敗:%@",error);

    }];
}

考慮以下幾個方面:

首先服務器端是否錯誤的在URL里面解析參數(URL的樣式和GET請求一樣),正確的應該是在Body里面解析移動端發來的Post請求。

然后依據你請求的資源,服務器返回的格式做一個調整。默認的AFHTTPSessionManager是json的解析,假如你下載圖片是會出錯的!然后再在acceptableContentTypes里面設置對應的服務器返回的類型。使用NSMutableDictionary作為參數的傳遞。其中POST和PUT方法有些許差別。后文將會對着差別進行個比較。

假如你順利的得到數據之后,怎樣才能變成你想要的結果呢。responseObject,就是最開始的狀態。最簡單的方式,我打一個斷點,這樣在控制台就能直接看到其屬性。然后用對應的初始化方法就行了。比如服務器返回的是json,那么manager就會把它處理成一個字典,key相同,value為后續的值,一般情況下為數組;再者,下載圖片,這時候結果應該是NSData類型的,使用UIImage.imageWithData就能將圖片轉化完成。

 

POST 和 PUT 請求圖片的差別:

先看方法PUT:

    NSData *imageData = UIImageJPEGRepresentation(image, 1);
    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    NSString* userTel = [user valueForKey:@"userPhone"];
    NSDictionary *paramDic = @{@"tel":userTel};

    NSMutableURLRequest * request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"PUT" URLString:@"http://example.com/avatar" parameters:paramDic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        [formData appendPartWithFileData:imageData name:@"newImg" fileName:[userTel stringByAppendingString:@".jpg"] mimeType:@"image/jpg"];
        
    } error:nil];
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/javascript",@"text/json",@"text/plain", nil];
    // 使用表單的方式進行提交, uploadTaskWithStreamedRequest  另一個直接上傳FileURL 的方式,會報錯500
    NSURLSessionUploadTask * task =  [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) {

    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        if (error) {
            NSLog(@"服務器出問題:%@",error);
        }
        
        NSLog(@"你啊啥的還是帶回家啊啥的%@",responseObject);
    }];

    [task resume];

 

查閱文檔http://cocoadocs.org/docsets/AFNetworking/3.1.0/Classes/AFHTTPSessionManager.html#//api/name/POST:parameters:constructingBodyWithBlock:progress:success:failure: 可以看到完整的POST如何拼接參數。使用的方法其實就是上面封裝的問題,本質的差別不大。appendPartWithFileData里面的name就是你使用postman發送請求時候,資源對應的參數名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM