如何为此示例 url 使用 AFNetworking2.0 代码?

Posted

技术标签:

【中文标题】如何为此示例 url 使用 AFNetworking2.0 代码?【英文标题】:How to use AFNetwowrking2.0 code for this Example url? 【发布时间】:2015-04-29 02:43:38 【问题描述】:

您好,我有一个返回 JSON 格式的示例 url。但是当我使用 AFNetWorking2.0 从该 URL 获取响应时,我没有得到正确的响应。我也在这里发送我的代码。

- (void)testHTTPS 
  AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
  [securityPolicy setAllowInvalidCertificates:YES];
   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
  [manager setSecurityPolicy:securityPolicy];

  [manager GET:@"xxxxx"
     parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) 
         NSLog(@"JSON: %@", responseObject);
         NSString* newStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
         NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
      failure:^(AFHTTPRequestOperation *operation, NSError *error) 
         NSLog(@"Error: %@", error);
     ];

我得到的 JSON Dic 总是为零。如果我打印“newstr”,我会得到 html 格式的响应。谁能找到正确的方法?

我已经按照你说的约翰做了,但我得到了以下结果

错误:错误域=com.alamofire.error.serialization.response Code=-1016 “请求失败:不可接受的内容类型:文本/html” UserInfo=0x7ffb39c52ed0 com.alamofire.serialization.response.error.response= URL: xxxxx 状态码: 200, headers “缓存控制”=“公共,最大年龄=10800”; “内容编码”= gzip; “内容长度”= 2922; “内容类型”=“文本/html”; 日期 =“格林威治标准时间 2015 年 4 月 29 日星期三 06:49:54”; Expires = "2015 年 4 月 29 日星期三 09:49:55 GMT"; “上次修改时间”=“格林威治标准时间 2015 年 4 月 1 日星期三 03:19:39”; 服务器 = "ECAcc (hhp/9ABE)"; Vary = "接受编码"; “X-缓存”=命中; ,NSErrorFailingURLKey = XXXXX,com.alamofire.serialization.response.error.data = ,NSLocalizedDescription =请求失败:不可接受的内容类型:文本/ HTML

【问题讨论】:

似乎响应不是 JSON,而是 XML/HTML(参见Content-Type),您可能需要考虑为此设置适当的响应序列化程序。 特别是回复是:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" conten 嗨,holex... 但是如果我在 onlinejsonviewer 中通过该链接,它会显示 JSON 格式的结果。如果我在搜索栏中通过该链接,那么我也会得到 JSON 结果 我建议您查看显示 headers properly 的那个 URL,上面写着 Content-Type: text/html,而不是 JSON – 内容的视觉外观在这里并不真正相关,我害怕。 PLUS: 在移动设备上,原始链接已被重定向到移动 HTML 网站:m.raaga.com/redis/facade.php?svc=home-mobile&l=T,这绝对是一个 HTML 页面;您的原始链接看起来只能在桌面浏览器中使用。 【参考方案1】:

问题在于您使用的是AFHTTPResponseSerializer,而不是AFNetworking 的AFJSONResponseSerializer。因此,当响应进来时,它会将其解析为 HTTP 响应而不是 JSON 响应。这很容易通过将您的 manager.responseSerializer 分配给 AFJSONResponseSerializer 来解决:

manager.responseSerializer = [AFJSONResponseSerializer serializer];

您会发现您不需要从响应中创建 NSDictionary - 成功后它应该已经作为 NSDictionary 对象通过。

查看AFNetworking 2.0 migration guide。这是一本非常方便的读物,可以让您了解未来需要注意的事项。

【讨论】:

感谢约翰·罗杰斯。正如你所说,我今晚会检查。我会更新你的结果。 我已经按照你说的约翰做了,但我得到了错误。我已通过添加该错误来编辑我的帖子。 该错误是因为您的 Web 服务返回的内容类型是“text/html”而不是“application/json”。序列化程序要求此内容类型标头是这样的。如果您无法更改 Web 服务的内容类型标头,您将不得不弄清楚如何使用 HTTP 序列化程序从响应中序列化 JSON。

以上是关于如何为此示例 url 使用 AFNetworking2.0 代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的url解析多个JSON对象和数组?我正在使用一个示例,我希望在该示例中使用它,

强制从 URL 下载图像的最长时间

有人有任何关于如何使用修改后的 Java 脚本值处理返回 Json (url) 的示例吗?

使用 FFMPEG 和 url_fopen 示例

如何使用 Crosswalk 长按获取 URL?

如何快速获取 iCloud 图片 URL