ios af 返回html,iOS 后台交互(AFNetworking)

我们前端的少不了和后台的交互。

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

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 - 服务器端错误

===

一般我们在项目中根据需求不同,都会把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 _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) {

}];

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值