問題❔javascript
今天在與後臺調接口的時候,遇到一個問題,使用AFNetworking報錯,具體以下:php
Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: unsupported media type (415)" UserInfo={com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7f84d1409fa0> { URL: http://api.mutualtalk.net/api/common/123456 } { status code: 415, headers { "Content-Language" = en; "Content-Length" = 1048; "Content-Type" = "text/html;charset=utf-8"; Date = "Tue, 05 Jul 2016 00:24:35 GMT"; Server = "nginx/1.10.1"; } },--------一些二進制數據,此處省略n行字, NSLocalizedDescription=Request failed: unsupported media type (415)
爲何會出現這個報錯呢?html
關於網絡請求的接口,一般的作法是,利用第三方AFNetworking,這個強大的網絡請求庫,再此基礎上,將項目中每一個模塊所用到的接口,進行一次簡單的封裝,這樣,每一個模塊中的接口都是一類,便於調用,管理,維護...java
先說一下個人作法,因爲以前後臺是php寫的,可是咱們的後臺是java寫的,都是搞server的,可是我不知道兩個語言對數據格式的處理,有什麼特殊的處理,反正套用以前的處理,報錯,跟後臺聯調,後臺根本接收不到請求,而後直接就報錯,見這陣勢,立馬度娘神馬,谷歌神馬?stockoverflow什麼的,各類答案,試了半天,然並卵,nginx
如下爲嘗試的解決方法:git
1>修改AFNetworking內部,這個文件AFURLResponseSerialization.m中修改代碼就能解決:github
第223行,初始化時,將以下代碼:json
1 self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", nil nil];
修改成:api
1 self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil nil];
結果,運行,然並卵,我不否定,可能能夠解決某些人遇到的問題,說是AFNetworking不支持以"text/html"格式的"content-type",反正我是添加了,沒啥用;網絡
2>在建立請求管理者(manger)是,作一些設置,其實本質上同第一種的解決方法是同樣的,給AFNetworking添加一種支持的"text/html"格式,沒什麼用,仍是報錯,要不報400錯;
//1.建立一個請求管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //初始化響應者 manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //添加一種支持的類型 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json", @"text/json", nil]; //2.發送請求 NSDictionary *dict = @{ @"mobile":@"1111111", @"type":@5, @"Code":@"86", @"key":@"eeqwerqwerqwerqwerqwe3af" }; NSString *url = @"http://api/asdfasd.com/334234"; url = [url stringByRemovingPercentEncoding]; [manager POST:url parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"請求成功%@",responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (error) { NSLog(@"%@",error); } }];
3>爲了解決這個問題,單開一個項目,專門解決這個報錯,因爲java後臺支持json數據格式傳輸,支持"application/json"格式的"content-type",後來在對請求數據格式和響應數據格式初始化的時候,將以前的父類換成了它的子類(AFJSONRequestSerializer);x-code7.3不提示(AFJSONRequestSerializer這個類),只有copy了,以下:
1 //初始化響應者 2 // manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 3 // manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 4 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 5 manager.responseSerializer = [AFJSONResponseSerializer serializer]; 6 7 /*************** 請忽略我--- *****************/ 8 /** 9 `AFJSONRequestSerializer` is a subclass of `AFHTTPRequestSerializer` that encodes parameters as JSON using `NSJSONSerialization`, setting the `Content-Type` of the encoded request to `application/json`. 10 */ 11 @interface AFJSONRequestSerializer : AFHTTPRequestSerializer 12 備註: 13 AFJSONRequestSerializer 繼承自AFHTTPRequestSerializer,不過參數的編碼形式,進行了設置,也就是設置 `Content-Type` 爲 `application/json`,具體調到頭文件,就是以下: 14 + (instancetype)serializer { 15 return [self serializerWithWritingOptions:(NSJSONWritingOptions)0]; 16 } 17 18 + (instancetype)serializerWithWritingOptions:(NSJSONWritingOptions)writingOptions 19 { 20 AFJSONRequestSerializer *serializer = [[self alloc] init]; 21 serializer.writingOptions = writingOptions; 22 23 return serializer; 24 }
至此,問題終於解決,到此,也只能怪本身學藝不精,吃一塹,長一智,慢慢積累吧,寫給本身吧
文章首發:[我的博客](https://yizibi.github.io/)