AFN的使用

AFN的github地址[https://github.com/pokeb/AFNetworking/AFNetworking]

使用AFNetworking的時(shí)候,可能由于解析的方式不同,就有可能不能正確解析返回的數(shù)據(jù). 這次遇到的錯(cuò)誤大概是下面的信息:

 Error Domain=com.alamofire.error.serialization.response Code=-1016 “Request failed: unacceptable content-type: text/xml”

AFNetworking本身默認(rèn)的解析只有一些json的格式,但常見的除了json外,還有html(text/html)格式和xml(text/xml)格式,因?yàn)榻馕龈袷讲蝗孕枰贏FN的源文件AFURLResponseSerialization.m中修改代碼就能解決:

對(duì)應(yīng)到自己的項(xiàng)目里面,需要改的是:

找到AFURLResponseSerialization.m文件

223行:

self.acceptableContentTypes = 
[NSSetsetWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil];```

知道錯(cuò)誤的地方之后,針對(duì)錯(cuò)誤-1016,我們還可以這么改:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//設(shè)置相應(yīng)內(nèi)容類型manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{ } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];


  • NSURLSession
  • AFURLSessionManager
  • AFHTTPSessionManager(封裝了常用的 HTTP 方法
    * GET
    * POST
    * UIKit + AFNetworking 分類
    * NSProgress :利用KVO - 半自動(dòng)的序列化&反序列化的功能
  • AFURLRequestSerialization :請(qǐng)求的數(shù)據(jù)格式/默認(rèn)是二進(jìn)制的
  • AFURLResponseSerialization :響應(yīng)的數(shù)據(jù)格式/默認(rèn)是JSON格式
  • 附加功能
  • 安全策略
    * HTTPS
    * AFSecurityPolicy
  • 網(wǎng)絡(luò)檢測(cè)
    * 對(duì)蘋果的網(wǎng)絡(luò)連接檢測(cè)做了一個(gè)封裝 * AFNetworkReachabilityManager

//創(chuàng)建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

//發(fā)送請(qǐng)求
第一個(gè)參數(shù):NSString類型的請(qǐng)求路徑,AFN內(nèi)部會(huì)自動(dòng)將該路徑包裝為一個(gè)url并創(chuàng)建請(qǐng)求對(duì)象
第二個(gè)參數(shù):請(qǐng)求參數(shù),以字典的方式傳遞,AFN內(nèi)部會(huì)判斷當(dāng)前是POST請(qǐng)求還是GET請(qǐng)求,以選擇直接拼接還是轉(zhuǎn)換為NSData放到請(qǐng)求體中傳遞
第三個(gè)參數(shù):請(qǐng)求成功之后回調(diào)Block 第四個(gè)參數(shù):請(qǐng)求失敗回調(diào)Block

//GET請(qǐng)求

  • (NSURLSessionDataTask *)GET:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
    failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

//POST請(qǐng)求

  • (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters
    success:(void (^)(NSURLSessionDataTask *task, id responseObject))success failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

//文件上傳
1.文件上傳拼接數(shù)據(jù)的第一種方式
[formData appendPartWithFileData:data name:@"file" fileName:@"ida.png" mimeType:@"application/octet-stream"];
2.文件上傳拼接數(shù)據(jù)的第二種方式
[formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"ida.png" mimeType:@"application/octet-stream" error:nil];
3.文件上傳拼接數(shù)據(jù)的第三種方式
[formData appendPartWithFileURL:fileUrl name:@"file" error:nil];

  • (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters constructingBodyWithBlock:(void (^)(id <AFMultipartFormData> formData))block
    success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
    failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure

//代碼
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

//2.發(fā)送POST請(qǐng)求上傳數(shù)據(jù)
/*
第一個(gè)參數(shù):請(qǐng)求路徑:NSString類型
第二個(gè)參數(shù):要上傳的非文件參數(shù) 第三個(gè)參數(shù):block回調(diào) 在該回調(diào)中,需要利用formData拼接即將上傳的二進(jìn)制數(shù)據(jù)
第三個(gè)參數(shù):上傳成功的block回調(diào) task:dataTask(任務(wù)) responseObject:服務(wù)器返回的數(shù)據(jù)
第四個(gè)參數(shù):上傳失敗的block回調(diào) error:錯(cuò)誤信息,如果上傳文件失敗,那么error里面包含了錯(cuò)誤的描述信息

[mgr POST:@"http://xxxx/upload" parameters:@{@"username" : @"123"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

// 在這個(gè)block中設(shè)置需要上傳的文件

    /*
     //拼接二進(jìn)制文件數(shù)據(jù)
     第一個(gè)參數(shù):要上傳的文件的二進(jìn)制數(shù)據(jù)
     第二個(gè)參數(shù):服務(wù)器接口規(guī)定的名稱
     第三個(gè)參數(shù):這個(gè)參數(shù)上傳到服務(wù)器之后用什么名字來進(jìn)行保存
     第四個(gè)參數(shù):上傳文件的MIMEType類型
     */

// NSData *data = [NSData dataWithContentsOfFile:@"1.png"];
// [formData appendPartWithFileData:data name:@"file" fileName:@"test.png" mimeType:@"image/png"];
// [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/wh/Desktop/placeholder.png"] name:@"file" fileName:@"xxx.png" mimeType:@"image/png" error:nil];
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"1.png"] name:@"file" error:nil];
}
success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"-------%@", responseObject);
}
failure:^(NSURLSessionDataTask *task, NSError *error) {}];


-(void)download{

//1.創(chuàng)建一個(gè)管理者
AFHTTPSessionManager *manage = [AFHTTPSessionManager manager];

//2.下載文件
/*
第一個(gè)參數(shù):請(qǐng)求對(duì)象
第二個(gè)參數(shù):下載進(jìn)度
第三個(gè)參數(shù):
block回調(diào),需要返回一個(gè)url地址,用來告訴AFN下載文件的目標(biāo)地址 targetPath:AFN內(nèi)部下載文件存儲(chǔ)的地址,tmp文件夾下
response:請(qǐng)求的響應(yīng)頭 返回值:文件應(yīng)該剪切到什么地方
第四個(gè)參數(shù):
block回調(diào),當(dāng)文件下載完成之后調(diào)用
response:響應(yīng)頭
filePath:文件存儲(chǔ)在沙盒的地址 == 第三個(gè)參數(shù)中block的返回值 error:錯(cuò)誤信息
*/

//2.1
創(chuàng)建請(qǐng)求對(duì)象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];

//2.2 創(chuàng)建下載進(jìn)度,并監(jiān)聽
NSProgress *progress = nil;
NSURLSessionDownloadTask *downloadTask = [manage
downloadTaskWithRequest:request progress:&progress
destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response)
{
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

//拼接文件全路徑
NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename]; NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
return filePathUrl;
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {
NSLog(@"文件下載完畢---%@",filePath); }];

//2.3 使用KVO監(jiān)聽下載進(jìn)度
[progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

//3.啟動(dòng)任務(wù)
[downloadTask resume];
}

//獲取并計(jì)算當(dāng)前文件的下載進(jìn)度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
}

最后編輯于
?著作權(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)容