AFNetworking 的封裝<二>

上一篇文章中封裝的方法體是對于常用服務(wù)器接口都可以使用的.但是我最近著手一個關(guān)于數(shù)據(jù)可視化的項(xiàng)目,其接口全在WebService上,我們需要展示客戶的各種數(shù)據(jù)并作出折線圖餅狀圖.然而當(dāng)我調(diào)用第一個接口時這套封裝方法就遇到了問題.對于POST請求.

報錯:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)"

遇到這個問題后,各種找原因,百度上答案翻了一遍.最終問題確定在兩個方面:
1,AFNetworking的支持解析類型是有限的,你需要在AFURLResponseSerialization.m里第227行處將

self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];改為
self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json", @"text/javascript", nil];

即增加它的可接受的類型.
2,在請求方法中,需要將發(fā)出的requestSerializer進(jìn)行操作.而不是對responseSerializer進(jìn)行操作.并直接用AFJSONRequestSerializer轉(zhuǎn)化.在收到響應(yīng)的方法體里也不再需要進(jìn)行JSONObjectWithData:方法的解析.代碼如下:(這一步很關(guān)鍵!)

#pragma mark -- POST請求 --
+ (void)postWithURLString:(NSString *)URLString parameters:(id)parameters success:(void (^)(NSDictionary * responseObject))success failure:(void (^)(NSError *error))failure{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (success) {
//            NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
//            success(dictionary);
success(responseObject);
}}  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}}];
}
#pragma mark -- POST/GET網(wǎng)絡(luò)請求 --
+ (void)requestWithURLString:(NSString *)URLString parameters:(id)parameters
type:(HttpRequestType)type success:(void (^)(NSDictionary * responseObject))success failure:(void (^)(NSError * error))failure {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//此句代碼可注釋.
switch (type) {
case HttpRequestTypeGet:
{
[manager GET:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (success) {
//                    NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
success(responseObject);
}}  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}}];
}
break;
case HttpRequestTypePost:
{
[manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (success) {
//                    NSDictionary * dictionary = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
//                    success(dictionary);
success(responseObject);
}}  failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failure) {
failure(error);
}}];
}
break;
}
}

這樣再進(jìn)行post請求就會正常調(diào)用了.
附:

// [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//此句代碼可注釋.

有人說可以在方法中加上這句話,大家可以試一下.
網(wǎng)絡(luò)請求這一塊看似簡單,其實(shí)真的值得我們好好挖掘.里面的方法很多都還沒有真正的理解到位.還需要慢慢的思考琢磨.我也相信,一個好的項(xiàng)目,一定是基于好的封裝,簡潔明了的體系.我們也都需要不斷的進(jìn)步和學(xué)習(xí)!

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

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

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