iOS 后台交互(AFNetworking)

作者: 奇董 | 来源:发表于2016-01-20 13:36 被阅读11287次

    我们前端的少不了和后台的交互。
    如果我们只会前端,后台的知识不是很懂的时候就交互的时候就会出现很多问题。当我们通过接口访问后台的出错的时候,如果感觉自己代码没问题,一定要找后台连调。有的时候时候,后台更新了接口。没有更新文档,那真是要人老命的一件事情。。

    AFNetworing

    我们做iOS,通过后台的给的接口得到一些我们想要的数据(json或者xml)。其实用苹果原本的SDK也可以,不过其中很多性能问题,像加载数据和更新界面。毕竟大牛们都优化过了.
    记录一下 AFN常用的一些操作
    首先要向后台请求数据
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];这边要注意,这不是一个单例。 我当年以为这是一个单例,差点被玩死、、、、、
    接着
    [manager POST:url parameters:para progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { success(responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { fail(error); }]; get 和post 差不多。
    这边要注意的点很多,因为大家是做项目后台都不一样。我们需要配置一些manager的一些属性才能正常的运行。
    这边列举几个经典的错误。

    1 请求数据

    1.1 纯404

    这种简单 有两种情况 1参数错误 2服务器没开

    1.1 -1016

    在进行网络请求时出现-1016 是因为只支持
    text/json,application/json,text/javascript
    你可以添加text/html
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",nil];

    1.2 3840

    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x9152780 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
    这个东西 加上就 好了
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    2.500+ 500 就是服务器的问题了

    附 错误码

    1xx - 信息提示
    2xx - 成功
    3xx - 重定向
    4xx - 客户端错误***

    5xx - 服务器端错误

    具体错误信息传送门http://www.cnblogs.com/adforce/archive/2011/12/25/2301050.html

    ===

    一般我们在项目中根据需求不同,都会把afn 二次封装一下,方便我们的使用。封装的方法 一般oc用代码块,swift 用必要。返回错误或者正确的信息,这边我对上面的POST请求简单的封装了一下,代码贴上来
    `.h + (void) postCallback:(NSDictionary *) para url:(NSString *) url success:(void (^)(id response))success fail:(void (^)(NSError *errror))fail;

    .m + (void)postCallback:(NSDictionary *)para url:(NSString *)url success:(void (^)(id))success fail:(void (^)(NSError *))fail {
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:url parameters:para progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
    success(responseObject);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    fail(error);
    }];
    }
    `
    其实就是把具体的请求封装起来,操作完成后。回调返回的信息,或者错误信息。代码块可是神器。

    上传图片

    首先NSURLSession 分为两种
    1.NSURLSessionManager
    2.NSHTTPSessionManager

    其实这两种都可以上传

    NSURLSessionManager

    这一种在 系统的readme 和github 上都有例子
    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];
    这种是知道文件文件路径,之后上传。

    还有一直传图片的形式是

    NSHTTPSessionManager

    这是http session 使我们经常向后台请求数据用的。
    我么可以图片放在http body里面上传,这是现在我们后台要求的方法
    ` AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",nil];
    [manager POST:KPhotoURL parameters:@{@"method":@"updatePhoto",@"userID":_oldInfoDict[@"userID"]} constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        [formData appendPartWithFileData:UIImageJPEGRepresentation(img,0.01) name:@"FileData" fileName:@"text.jpg" mimeType:@"image/jpg"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
    }];
    

    `

    相关文章

      网友评论

      • 诸子百家谁的天下:3840 这个错误是响应的数据解析的时候出错,加上这一句即可sessionManager.responseSerializer=[AFHTTPResponseSerializer serializer]; request的格式可以用json的模式
      • 7b55888775cd:想请问 请求数据3840
        我照着您的方法做了之后确实解决我的问题
        但是回传的讯息变成一堆数字给我

        正常的话应该会回传数字 1给我
        这会是什么原因呢?
        4eeaae2775c2:我也是,为什么是一堆数字啊
        7b55888775cd:@c9c9d0f5c60b 目前也是無解
        我原本是设定
        sponseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
        不知道为什么,POST成功但还是会跑到失败去
        所以改成这个方法 虽然能执行正确的程式码 但实在不知道为什么会跑出那么多数字
        c9c9d0f5c60b:@bboyadie 朋友,你好。请问你的问题你解决了吗?我的问题跟你一样,返回的一堆数字
      • 郑明明:要做标题党嘿嘿
      • 郑明明:不错啊,但是在简书的搜索引擎中很难搜到啊....
      • a3c619581c4f:挺详细的,喜欢
      • 煜寒了:很用心的文章!

        代码部分可使用
        ```
        你的代码
        ```

        格式优化布局 :smile:
        60343a0ad510:@煜寒了 6 。 :joy:
        煜寒了:@那种可能我在乎 恩恩 这噶发布之后也可以重新编辑的,你可以先试试看
        奇董:@煜寒了 阔以的,又学了一招,下次撸代码的时候试试看 3q :smile:

      本文标题:iOS 后台交互(AFNetworking)

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