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


問題❔

今天在與后台調接口的時候,遇到一個問題,使用AFNetworking報錯,具體如下:

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)

為什么會出現這個報錯呢?

關於網絡請求的接口,通常的做法是,利用第三方AFNetworking,這個強大的網絡請求庫,再此基礎上,將項目中每個模塊所用到的接口,進行一次簡單的封裝,這樣,每個模塊中的接口都是一類,便於調用,管理,維護...

先說一下我的做法,由於之前后台是php寫的,但是我們的后台是java寫的,都是搞server的,但是我不知道兩個語言對數據格式的處理,有什么特殊的處理,反正套用之前的處理,報錯,跟后台聯調,后台根本接收不到請求,然后直接就報錯,見這陣勢,立馬度娘神馬,谷歌神馬?stockoverflow什么的,各種答案,試了半天,然並卵,

以下為嘗試的解決方法:

1>修改AFNetworking內部,這個文件AFURLResponseSerialization.m中修改代碼就能解決:

第223行,初始化時,將如下代碼:

 

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

 

修改為:

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/)  

[AFNetworking報錯:415...](https://yizibi.github.io/2016/01/16/AFNetworking%E6%8A%A5%E9%94%99415/) 轉載注明出處;

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM