iOS 9 Afnetworking 3.0 Request failed: unacceptable content-type: text/plain

iOS"Request failed: unacceptable content-type: text/html"

(2014-11-24 14:12:12)

 

以前用的好端端的接口,今天访问居然出错了,但是再用浏览器测试,发现可以正常返回数据,甚是奇怪啊。

下面是错误信息:

获取服务器响应出错 error=ErrorDomain=com.alamofire.error.serialization.response Code=-1016"Request failed: unacceptable content-type: text/html"UserInfo=0x7fdfd8729680{com.alamofire.serialization.response.error.response= { URL:http://172.16.1.31:7001/itom/getwork } { status code: 200, headers{

   "Cache-Control" = "no-cache";

   "Content-Type" = "text/html;charset=UTF-8";

    Date= "Mon, 24 Nov 2014 03:13:16 GMT";

   "Transfer-Encoding" = Identity;

   "X-Powered-By" = "Servlet/2.5 JSP/2.1";

} },NSErrorFailingURLKey=http://172.16.1.31:7001/itom/getwork,com.alamofire.serialization.response.error.data=<5b7b227374617475 73223a22 73756363 65737322 2c226d73 67223a22 e799bbe99986e688 90e58a9f 227d5d>, NSLocalizedDescription=Requestfailed: unacceptable content-type: text/html}


下面是百度出来的答案:

I also encountered the same problem.This means that your server issending "text/html" insteadof the already supported types. After a little search, my solutionwas toadd "text/html" to acceptableContentTypes setin AFURLResponseSerialization class.Just search for "acceptableContentTypes" andadd @"text/html" tothe set manually. Of course, the ideal solution will be to changethe tpe from the server, but for that you will hade to talk withthe server team.

I hope this helps you. Best regards andless bugs as possible in the code.

 op.responseSerializer.acceptableContentTypes =[NSSet setWithObject:@"text/html”];


对应到自己的项目里面,我用的是AFNetworking这套网络请求包,需要改的是:

AFURLResponseSerialization.m文件

223行:

self.acceptableContentTypes =[NSSetsetWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript", nil];

加上蓝色部分,其实就是添加一种服务器返回的数据格式。

HTTP Content-type 与 AFNetworking

这篇文章主要记录一下之前爬过的一个坑,关于使用 AFNetworking 中请求数据和 HTTP 的 Content-type 关系。

在iOS端我们常用JSON来作为数据传输格式,对于HTTP网络通信框架现在也是 AFNetworking 居多,在 AFNetworking 2.0 ,有了比较大的变化,引入了 iOS 7 / Mac OS X 10.9 的 NSURLSession ,而在 AFNetworking 中对JSON、XML等数据对象都有良好的支持,在文档中就可以看到新增了 Serialization 对象,我简单画了个图以看得更清晰:

试了下百度FEX开发的在线脑图工具 kityminder ,并且是开源项目,还真方便,点这里还可以在线查看。

可以看到 Serialization 派生出 AFURLRequestSerializationAFURLResponseSerialization ,分别作为请求数据和接受数据的序列化方式。AFURLResponseSerialization 又派生出好几种响应数据序列化方式,能正确的使用他们将给我们带来极大的方便。

像我们如果用 AFHTTPSessionManager 的话,在初始化后就会设置一个属性 responseSerializer,这就是上图所述的 AFURLResponseSerialization,告诉AFNetworking 以怎样的方式接受数据,如果后段接口都是标准的JSON数据格式,那么很愉快的就选择了 AFJSONResponseSerializer ,在请求成功的Block中的responseObject 就会是一个 AFNetworking 帮你解好档的JSON,也就是一个 NSDictionary对象。

但有时候你是否遇到明明接口是返回的JSON数据,可用 AFJSONResponseSerializer 就会报错,错误信息类似:

Request failed: unacceptable content-type: text/html

这就是因为HTTP响应头中的 Content-Type 字段对不上号,最简单的方法就是在浏览器的开发者工具中看到:

如果接口返回的 Content-Type 和实际情况不合时,有时候是因为后端开发人员不规范,我更有遇到一套接口中大多都是JSON返回,还有个别方法返回纯文本,如:“YES”,这些都是接口开发人员不规范导致的问题,作为iOS端,我们有两种解决方案:

  1. 告诉接口开发人员规范写法,你好我好大家好!(推荐)
  2. responseSerializer 使用 AFHTTPResponseSerializer,这样就不能享受 AFNetworking 自带的JSON解析功能了,拿到 responseObject 就是一个 Data 对象,需要自己根据需要进行反序列化。

关于 Content-Type ,可能还是有些同学不太清楚的,这是HTTP的基础知识,做后端的同学应该得知道。

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。 - via 百度百科

这里还找到一个 Content-Type 对照表:http://tool.oschina.net/commons

时间: 2025-01-29 12:04:37

iOS 9 Afnetworking 3.0 Request failed: unacceptable content-type: text/plain的相关文章

ios-使用AFNetWorking 上传字符串,请求失败,Request failed: 请求太大

问题描述 使用AFNetWorking 上传字符串,请求失败,Request failed: 请求太大 我要把图片换成nsdata,然后再用base64encoding,把encoding后生成的字符串上传到 服务器,就出这个问题, 报错信息:err:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: 请求太大 (413)" 我同事用的ASIHTTPRequest库就没问

AFNetworking 3.0 Code=-1016 错误解决方案

AFNetworking 3.0 Code=-1016 错误解决方案 导入AFNetworking类库(请参考:iOS 9 导入类库全面详尽过程(Ruby安装->CocoaPods安装->导入类库))之后,然后小伙伴们就可以照着如下官方文档欢乐地写代码. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; [manager GET:@"http://blog.csdn.net/sps900608"

ios-用AFNetworking上传图片报Request failed: 未找到 (404)错

问题描述 用AFNetworking上传图片报Request failed: 未找到 (404)错 今天做上传图片功能, 直接贴代码 +(void)uploadImgWithImgData:(NSData *)imgData aiv:(UIActivityIndicatorView *)aiv loginName:(NSString *)loginName type:(NSString *)type idStr:(NSString *)idStr successB:(void(^)(id res

Linux有问必答:如何修复“X11 forwarding request failed on channel 0”错误

Linux有问必答:如何修复"X11 forwarding request failed on channel 0"错误 问题: 当我尝试使用SSH的X11转发选项连接到远程主机时, 我在登录时遇到了一个 "X11 forwarding request failed on channel 0" (X11 转发请求在通道0上失败)的错误. 我为什么会遇到这个错误,并且该如何修复它? 首先,我们假设你已经正确启用了SSH的X11转发. 如果你在登录时遇到"X1

[翻译] Working with NSURLSession: AFNetworking 2.0

Working with NSURLSession: AFNetworking 2.0   简单翻译,有很多错误,看官无法理解处请英文原文对照. http://code.tutsplus.com/tutorials/working-with-nsurlsession-afnetworking-20--mobile-22651 by Bart Jacobs3 Feb 2014 In the previous installments of this series, we've taken a cl

[翻译] AFNetworking 2.0

大名鼎鼎的开源网络库AFNetworking 2.0,目前只是翻译了Github上的链接文章,使用教程请点击 http://www.cnblogs.com/YouXianMing/p/3651462.html   https://github.com/AFNetworking/AFNetworking   AFNetworking is a delightful networking library for iOS and Mac OS X. It's built on top of the F

php错误提示failed to open stream: HTTP request failed!的完美解决方法

google或者baidu一下,好多这样的问题,解决的方法都是修改php.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On 这样做可以解决某些人的问题,有人说在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可.)重启服务器. 但是有些还是会有这个警告信息,想用完美的解决

AFNetworking 2.0使用(持续更新)

本人视频教程系列   导入AFNetworking 2.0 文件夹,引入头文件AFNetworking.h --------------- *使用NSURLSessionDownloadTask来下载一张图片,并带有下载进度(以下两段代码是一起的,注意) NSProgress为iOS7新增加的类 // 定义一个progress指针 NSProgress *progress; // 创建一个URL链接 NSURL *url = [NSURL URLWithString:\ @"http://wal

php错误提示failed to open stream: HTTP request failed!的完美解决方法_php技巧

google或者baidu一下,好多这样的问题,解决的方法都是修改php.ini,把allow_url_fopen给启用,改成 allow_url_fopen = On 这样做可以解决某些人的问题,有人说在php.ini中,有这样两个选项:allow_url_fopen =on(表示可以通过url打开远程文件),user_agent="PHP"(表示通过哪种脚本访问网络,默认前面有个 " ; " 去掉即可.)重启服务器. 但是有些还是会有这个警告信息,想用完美的解决