首页 > Web开发 > 详细

AFHTTPSessionManager 的使用方法

时间:2019-10-17 13:09:59      阅读:514      评论:0      收藏:0      [点我收藏+]

最近对

最近使用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发送请求时候,资源对应的参数名。

AFHTTPSessionManager 的使用方法

原文:https://www.cnblogs.com/JMarshall/p/11691197.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!