iOS 后臺(tái)交互(AFNetworking)

我們前端的少不了和后臺(tái)的交互。
如果我們只會(huì)前端,后臺(tái)的知識(shí)不是很懂的時(shí)候就交互的時(shí)候就會(huì)出現(xiàn)很多問題。當(dāng)我們通過接口訪問后臺(tái)的出錯(cuò)的時(shí)候,如果感覺自己代碼沒問題,一定要找后臺(tái)連調(diào)。有的時(shí)候時(shí)候,后臺(tái)更新了接口。沒有更新文檔,那真是要人老命的一件事情。。

AFNetworing

我們做iOS,通過后臺(tái)的給的接口得到一些我們想要的數(shù)據(jù)(json或者xml)。其實(shí)用蘋果原本的SDK也可以,不過其中很多性能問題,像加載數(shù)據(jù)和更新界面。畢竟大牛們都優(yōu)化過了.
記錄一下 AFN常用的一些操作
首先要向后臺(tái)請(qǐng)求數(shù)據(jù)
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];這邊要注意,這不是一個(gè)單例。 我當(dāng)年以為這是一個(gè)單例,差點(diǎn)被玩死、、、、、
接著
[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 差不多。
這邊要注意的點(diǎn)很多,因?yàn)榇蠹沂亲鲰?xiàng)目后臺(tái)都不一樣。我們需要配置一些manager的一些屬性才能正常的運(yùn)行。
這邊列舉幾個(gè)經(jīng)典的錯(cuò)誤。

1 請(qǐng)求數(shù)據(jù)

1.1 純404

這種簡(jiǎn)單 有兩種情況 1參數(shù)錯(cuò)誤 2服務(wù)器沒開

1.1 -1016

在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí)出現(xiàn)-1016 是因?yàn)橹恢С?br> 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.}
這個(gè)東西 加上就 好了
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer];
2.500+ 500 就是服務(wù)器的問題了

附 錯(cuò)誤碼

1xx - 信息提示
2xx - 成功
3xx - 重定向
4xx - 客戶端錯(cuò)誤***

5xx - 服務(wù)器端錯(cuò)誤

具體錯(cuò)誤信息傳送門http://www.cnblogs.com/adforce/archive/2011/12/25/2301050.html

===

一般我們?cè)陧?xiàng)目中根據(jù)需求不同,都會(huì)把a(bǔ)fn 二次封裝一下,方便我們的使用。封裝的方法 一般oc用代碼塊,swift 用必要。返回錯(cuò)誤或者正確的信息,這邊我對(duì)上面的POST請(qǐng)求簡(jiǎn)單的封裝了一下,代碼貼上來
`.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);
}];
}
`
其實(shí)就是把具體的請(qǐng)求封裝起來,操作完成后。回調(diào)返回的信息,或者錯(cuò)誤信息。代碼塊可是神器。

上傳圖片

首先NSURLSession 分為兩種
1.NSURLSessionManager
2.NSHTTPSessionManager

其實(shí)這兩種都可以上傳

NSURLSessionManager

這一種在 系統(tǒng)的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 使我們經(jīng)常向后臺(tái)請(qǐng)求數(shù)據(jù)用的。
我么可以圖片放在http body里面上傳,這是現(xiàn)在我們后臺(tái)要求的方法
` 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) {
    
}];

`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容