今天在與后臺(tái)調(diào)接口的時(shí)候,遇到一個(gè)問題,使用AFNetworking報(bào)錯(cuò),具體如下:
請(qǐng)求失敗:Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set., NSUnderlyingError=0x60800024cd20 {Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x608000235d00> { URL: https://192.168.1.42/siweb/iface/user/checkLogin } { status code: 415, headers {**
Connection = "keep-alive";**
"Content-Language" = en;**
"Content-Length" = 1048;**
"Content-Type" = "text/html;charset=utf-8";**
Date = "Mon, 12 Dec 2016 06:45:00 GMT";**
Server = "nginx/1.10.2";**
} }, NSErrorFailingURLKey=https://192.168.1.42/siweb/iface/user/checkLogin, com.alamofire.serialization.response.error.data**
為什么會(huì)出現(xiàn)這個(gè)報(bào)錯(cuò)呢?百度了很多資料锨推,然而并沒有找到好的解決方法。
以下為嘗試的解決方法:
1>修改AFNetworking內(nèi)部,這個(gè)文件AFURLResponseSerialization.m中修改代碼就能解決:
第223行,初始化時(shí),將如下代碼:
1 self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil];
修改成
1 self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil nil];
結(jié)果,并沒有什么用,我不否認(rèn),可能可以解決某些人遇到的問題,說是AFNetworking不支持以"text/html"格式的"content-type",反正我是添加了,沒啥用;
2>在創(chuàng)建請(qǐng)求管理者(manger)是,做一些設(shè)置公壤。在封裝的時(shí)候添加了這兩行代碼
結(jié)果還是不行
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer = [AFHTTPRequestSerializer serializer];
// post請(qǐng)求
+ (void)POST:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(id responseObject))success
failure:(void (^)(NSError *error))failure
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer = [AFHTTPRequestSerializer serializer];
[manager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
//
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if(success)
{
success(responseObject);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if(error)
{
failure(error);
}
}];
}
3>為了解決這個(gè)問題嘗試了很多方法换可。后來在對(duì)請(qǐng)求數(shù)據(jù)格式和響應(yīng)數(shù)據(jù)格式初始化的時(shí)候,將之前的父類(AFHTTPRequestSerializer)換成了它的子類(AFJSONRequestSerializer)
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
這次請(qǐng)求成功了,數(shù)據(jù)也出來厦幅。
總結(jié):成功以后沾鳄,我把添加的代碼去掉,請(qǐng)求也成功确憨,其實(shí)并不是我們?cè)O(shè)置請(qǐng)求報(bào)文時(shí)译荞,沒設(shè)置接受“text/html”的問題。因?yàn)楹笈_(tái)返回的響應(yīng)報(bào)文的接受類型就是@“application/json”類型的休弃,所以AFN已經(jīng)設(shè)置好了吞歼,與這個(gè)無關(guān)。
1 self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil nil];
但為什么會(huì)出現(xiàn)這個(gè)問題呢塔猾?我猜測(cè)應(yīng)該是后臺(tái)沒有設(shè)置好返回的類型是什么篙骡,導(dǎo)致出現(xiàn)這樣的狀況,所以我們得一開始就設(shè)置初始化請(qǐng)求的格式和返回的格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];