【问题标题】:Unable to get response using AFNetworking 2.0 using GET method使用 GET 方法无法使用 AFNetworking 2.0 获得响应
【发布时间】:2014-07-08 21:33:18
【问题描述】:

我无法使用这种方法获取数据,但是在使用其他 url 时它可以工作,而且我还在 postman 中进行了测试,我得到了响应。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

// if you want to sent parameters you can use above code

manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager GET:@"http://192.168.1.156:81/a.php" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"responseObject %@",responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

}];

错误:

“请求失败:不可接受的内容类型:文本/html” UserInfo=0x8a6b000 {NSErrorFailingURLKey=http://192.168.1.156:81/a.php,AFNetworkingOperationFailingURLResponseErrorKey={ URL:http://192.168.1.156:81/a。 php } { 状态码:200,标题 { 连接=“保持活动”; “内容类型”=“文本/html”; 日期 =“格林威治标准时间 2014 年 5 月 20 日星期二 14:49:20”; “保活”=“超时=5,最大值=100”; 服务器 = "Apache/2.4.4 (Win64) PHP/5.4.12"; “传输编码” = 身份; "X-Powered-By" = "PHP/5.4.12"; } }, NSLocalizedDescription=请求失败:不可接受的内容类型:text/html}

NSArray 转换错误:

解析 JSON 失败:错误域=NSCocoaErrorDomain Code=3840“操作无法完成。(Cocoa 错误 3840。)”(字符 4677 周围的转义序列无效。) UserInfo=0xa82c130 {NSDebugDescription=字符周围的转义序列无效4677.}

第 258 行的解析错误:
... "story_title": "今天的故事",
----------------------^
期待 'STRING'、'NUMBER'、'NULL'、'TRUE'、'FALSE'、'{'、'['

【问题讨论】:

  • 您检查过failure 块中的NSError 对象吗?它说什么?
  • @Rob - 我已经用答案更新了我的问题
  • 与您的问题无关,但是,顺便说一句,为 GET 请求指定 AFJSONRequestSerializer 有点奇怪。 GET 请求没有正文,而是在 URL 中编码它们的参数。而且,此外,您没有任何参数。

标签: ios objective-c json afnetworking


【解决方案1】:

您的错误消息告诉您 AFNetworking 期待 JSON 响应(即,响应标头的 Content-Type 应该是 application/json 并且响应的主体应该是实际的 JSON)。

这里有多种可能性之一:

  1. 您的服务正在返回 JSON 正文,但忽略指定 Content-Type 标头。在您的 PHP 代码中,在发送任何数据之前,指定 Content-Type 标头:

    header("Content-Type: application/json");
    

    如果您无法修复 PHP(这是首选解决方案),您也可以告诉 AFNetworking 也接受 text/html 作为 Content-Type。我没有对此进行测试,但类似下面的内容应该将text/html 添加到默认AFJSONResponseSerializeracceptableContentTypes 集合中:

    manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    
  2. 您的 Web 服务并非旨在返回 JSON。在这种情况下,您应该配置 manager 以接受非 JSON 响应,例如:

    mananger.responseSerializer = [AFHTTPResponseSerializer serializer];
    
  3. 您的 Web 服务旨在正确返回 JSON 响应,但遇到了一些程序错误,导致无法正确生成 JSON。在这种情况下,临时更改 manager 以接受非 JSON 响应(如上面的第 2 点),然后检查响应(当然,假设您已将 php.ini 配置为报告错误):

    NSLog(@"responseObject = %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding);
    

    如果您看到的是 JSON,可以使用 NSJSONSerialization 将其转换为数组:

    NSError *error;
    NSArray *array = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:&error];
    if (!array) {
        NSLog(@"Parsing JSON failed: %@", error);
    }
    

    显然,您可以将这个本地 NSArray 对象保存到您想要的任何类属性或实例变量中。


您已使用 JSON 解析错误更新您的问题。这是 JSON 中 \ 字符的结果。那是无效的。 (将您的 JSON 粘贴到 http://jsonlint.com 中,它会确认这一点。)您的 PHP 没有正确生成 JSON。在' 之前删除\。只有在 JSON 中包含双引号时,才应使用此反斜杠转义。

坦率地说,您似乎手动创建了这个 JSON。使用 PHP 函数 json_encode 会更好,它会为您完成所有适当的转义,完全避免这类 JSON 错误。

【讨论】:

  • 为什么我不能转换成 NSArray
  • @user3635892 您的响应是 JSON 格式吗?然后您需要让您的 PHP 指定 JSON Content-Type 标头(以便 AFNetworking 可以为您进行此转换),或者您必须手动覆盖响应序列化程序的 acceptableContentTypes,或者您需要将 AFHTTPResponseSerializer 指定为如上所示,然后自己执行NSJSONSerialization。您必须更新您的问题,向我们展示回复,以便我们进一步帮助您。
  • 它的 NSData 与您的选项 3 一起被转换为字符串,然后如何将其转换为 NSArray
  • @user3635892 我是否正确假设该字符串是有效的 JSON?然后这证实了您的 PHP 代码根本没有在其响应中指定 Content-Type 标头的理论。这是正确的解决方法,更新 PHP 以调用 header 函数。或者,您可以指定 text/html 对于 AFJSONResponseSerializer 是有效的 Content-type(即使它不是真的)。或者您可以使用我的答案的第三种方法,手动调用NSJSONSerialization 将其转换为NSArray,如我修改后的答案所示。
  • @user3635892 我建议您使用创建 JSON 响应的 PHP 代码发布一个新问题。您有许多超出此问题范围的问题(未指定 Content-Type 标头,手动构建 JSON)。但是,如果您愿意,请随时在此处分享指向该新问题的链接。而且,不要忘记接受这个答案(通过单击它旁边的复选标记),当然假设我解决了您的 Objective-C 问题。见What should I do when someone answers my question?
【解决方案2】:

-(void)load_home_page_data_withIndex:(NSString *)startindex and TotalRecord:(NSString *)count {

NSDictionary *favParameter;
NSString *URL1;
[MBProgressHUD showHUDAddedTo:[[[UIApplication sharedApplication] delegate] window] animated:YES];

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];

NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];

NSString *uId=[defaults valueForKey:@"UserID"];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

URL1=[BASE_URL stringByAppendingString:@"home"];
favParameter=@{
               @"user_id":uId,//[defaults valueForKey:@"UserID"
             //  @"no":startindex,
             //  @"total_record":count,
               };

AFHTTPRequestOperation *op = [manager POST:URL1 parameters:favParameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
}
                                   success:^(AFHTTPRequestOperation *operation, id responseObject)

                              {
                                  __weak Home *weakSelf = self;
                                  [weakSelf.tblObj.pullToRefreshView stopAnimating];
                                  [weakSelf.tblObj.infiniteScrollingView stopAnimating];

                                  [MBProgressHUD hideHUDForView:[[[UIApplication sharedApplication] delegate] window] animated:YES];

                                  NSError *jsonParsingError = nil;
                                  NSMutableDictionary *responseDict = (NSMutableDictionary *)[NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];


                                  [album_id removeAllObjects];
                                  [photo_id removeAllObjects];
                                  [photo_name removeAllObjects];
                                  [likes removeAllObjects];
                                  [user_id removeAllObjects];
                                  [is_like removeAllObjects];
                                  [Owner_id removeAllObjects];
                                  [imagesarr removeAllObjects];
                                  [user_name removeAllObjects];
                                  [arrPhotoDetail removeAllObjects];
                                  [share_name removeAllObjects];
                                  [date_time removeAllObjects];

                                  [_tblObj setContentOffset:CGPointMake(0, 0)];

                                  int count_notification = [[responseDict valueForKey:@"count_notification"] intValue];
                                  int count_friend_notification = [[responseDict valueForKey:@"count_friend_notification"] intValue];

                                  if (count_notification>0)
                                  {
                                      [_lblNotification_count setText:[NSString stringWithFormat:@"%@  ",[responseDict valueForKey:@"count_notification"]]];
                                      [_lblNotification_count setHidden:NO];
                                  }
                                  else
                                  {
                                      [_lblNotification_count setHidden:YES];
                                  }

                                  if (count_friend_notification>0)
                                  {
                                      [_lblFriendReq_count setText:[NSString stringWithFormat:@"%@  ",[responseDict valueForKey:@"count_friend_notification"]]];
                                      [_lblFriendReq_count setHidden:NO];
                                  }
                                  else
                                  {
                                      [_lblFriendReq_count setHidden:YES];
                                  }

                                  NSString *s1=[NSString stringWithFormat:@"%@",[responseDict valueForKey:@"success"]];
                                  //NSString *s2=[NSString stringWithFormat:@"%@",[responseDict valueForKey:@"msg"]];

                                  if ([s1 isEqualToString:@"1"])
                                  {
                                      [_imgNoData setHidden:YES];

                                      NSMutableArray *arrResult=[responseDict objectForKey:@"result"];

                                      for (int i=0; i<[arrResult count]; i++)
                                      {
                                          NSDictionary *ResultDisc=[arrResult objectAtIndex:i];

                                          [album_id addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"album_id"]]];
                                          [user_name addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"user_name"]]];
                                          [share_name addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"title"]]];
                                          [photo_name addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"user_image"]]];
                                          [likes addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"total_likes"]]];
                                          [is_like addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"is_like"]]];
                                          [arrPhotoDetail addObject:[ResultDisc valueForKey:@"images"]];
                                          [date_time addObject:[NSString stringWithFormat:@"%@",[ResultDisc valueForKey:@"datetime1"]]];

                                          //images
                                          NSArray *arrAns = [ResultDisc valueForKey:@"images"];
                                          NSMutableArray *arr = [[NSMutableArray alloc]init];
                                          //imagesarr
                                          for (int i=0; i<arrAns.count; i++)
                                          {
                                              [arr addObject:[[arrAns objectAtIndex:i] valueForKey:@"photo_title"]];
                                              [Owner_id addObject:[NSString stringWithFormat:@"%@",[arrAns valueForKey:@"owner_id"]]];
                                              [photo_id addObject:[NSString stringWithFormat:@"%@",[arrAns valueForKey:@"photo_id"]]];
                                          }
                                          [imagesarr addObject:arr];
                                          if([ResultDisc objectForKey:@"reviews"] != nil && [[ResultDisc objectForKey:@"reviews"] count] > 0) {
                                              [review addObject:[[ResultDisc objectForKey:@"reviews"] objectAtIndex:0]];
                                          }
                                          else {
                                              [review addObject:@""];
                                          }
                                      }
                                  }
                                  else
                                  {
                                      [_imgNoData setHidden:NO];
                                  }
                                  [_tblObj reloadData];

                              }
                                   failure:^(AFHTTPRequestOperation *operation, NSError *error)
                              {
                                  __weak Home *weakSelf = self;
                                  [weakSelf.tblObj.pullToRefreshView stopAnimating];
                                  [weakSelf.tblObj.infiniteScrollingView stopAnimating];

                                  [MBProgressHUD hideHUDForView:[[[UIApplication sharedApplication] delegate] window] animated:YES];
                                  [Utilities displayAlertWithTitle:@"Network Error" andMessage:@"" forView:self];
                              }];
[op start];

}

【讨论】:

    【解决方案3】:

    尝试延迟加载:

    [cell.Profile_btn setBackgroundImageForState:UIControlStateNormal 
                      withURL:[NSURL URLWithString: [
                          NSString stringWithFormat:@"http://downloadwhatsbest.com/assets/front/users/thumb/%@",
                              [photo_name objectAtIndex:indexPath.row]
                          ]
                      ]
                      placeholderImage:[UIImage imageNamed:@"USER_INVITE"]];
    

    我已对其进行了格式化以便更好地阅读。删除空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2016-11-05
      • 2014-06-06
      • 2019-10-03
      相关资源
      最近更新 更多