使用AFNetworking3.0后網絡請求由原來的AFHTTPRequestOperationManager變為AFHTTPSessionManager。一般的Post請求變成了這樣:
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"phoneNumber"] = @"18000000000";
params[@"password"] = @"123";
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
[session POST:@"" parameters:@"" progress:params success:nil failure:nil];
最近后台要求我們提交post請求使用JSON格式,如{"password":"123","phoneNumber":"18000000001"};
使用原有請求方式請求報錯error:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: service unavailable (503)"。如圖:
無意間發現MJExtension中有將字典轉為JSON字符串的方法[params mj_JSONString],然后心里默默稱贊了傑哥的強大,看了下轉JSON的源碼,以為如此簡單就可以解決問題。事實證明我還是too young too simple,控制台依舊輸出錯誤error:Error Domain=NSCocoaErrorDomain Code=3840 "No value for key in object around character 7998."。
無奈之下趕緊到github上翻看AFNetworking的文檔,發現有這樣一句話:
JSON Parameter Encoding
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
POST http://example.com/
Content-Type: application/json
{"foo": "bar", "baz": [1,2,3]}
立馬將這句話加入到網絡請求當中:(方法一)
// 獲得請求管理者
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
// 設置請求格式
session.requestSerializer = [AFJSONRequestSerializer serializer];
[session.requestSerializer requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
[session POST:@"" parameters:@"" progress:nil success:nil failure:nil];
果不其然,這次的返回結果就正常了。
(方法二)最后在網上搜尋了一圈看到也可以使用AFURLSessionManager
來做網絡請求,不過AFURLSessionManager
需要上傳個NSData類型的數據。代碼如下:
NSData *postData = [parameters dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSMutableURLRequest *request = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:@"url" parameters:nil error:nil];
request.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPBody:postData];
[[manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
NSLog(@"responseObject: %@", responseObject);
} else {
NSLog(@"error: %@, %@, %@", error, response, responseObject);
}
}] resume];至此這個問題算是解決了,也可以正常拿到后台返回的數據。