上一篇文章中封裝的方法體是對于常用服務(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í)!