如何通过 AFNetworking 创建简单的 Http 请求

Posted

技术标签:

【中文标题】如何通过 AFNetworking 创建简单的 Http 请求【英文标题】:how to create simple Http request via AFNetworking 【发布时间】:2013-10-04 16:53:47 【问题描述】:

我仍在使用 ASIHTTPRequest,我正在寻找转移到 AFNetworking 我也经历过Raywenderlich Crash Course 但它没有使用 AFNetworking 2.0

我刚刚尝试了AFNetworking 中提到的以下示例 但它无法正常工作。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

NSDictionary *parameters = @@"UserId": @"24",@"ArticleId":@"0";

NSLog(@"%@",parameters);



[manager POST:@"http://mysite.com/api/User/showArticleList" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)

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


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

    NSLog(@"Error: %@", error);
];

调试区显示:

错误域=NSCocoaErrorDomain 代码=3840 “操作无法完成。(Cocoa 错误 3840。)”(JSON 文本未以数组或对象开头,并且未设置允许片段的选项。) UserInfo=0xa0ba580 NSDebugDescription=JSON 文本未以允许未设置片段的数组或对象和选项。

但是当我使用链接时提到 Raywenderlich 速成课程

 [manager POST:@"http://www.raywenderlich.com/downloads/weather_sample/weather.php?format=json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
 
     NSLog(@"JSON: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error)
 
     NSLog(@"Error: %@", error);
 ];

它给了我完美的 JSON 输出,为什么会这样?

【问题讨论】:

你把setDefaultHeader:@"Accept" value:@"application/json"放了吗 上述情况下是AFNetworking 2.0 无法设置setDefaultHeader。 【参考方案1】:

我终于找到了解决方法如下-

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];


  NSDictionary *parameters = @@"UserId": @"24",@"Name":@"Robin";

  NSLog(@"%@",parameters);
  parameters = nil;

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

    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager POST:@"http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
    

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


   failure:^(AFHTTPRequestOperation *operation, NSError *error)
   
        NSLog(@"Error: %@", error);
   ];

对于 text/Html + 如果它没有提供正确的 JSON 字符串,您可以将其从字符串中删除并将其转换为数组或字典。

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

        // if you want to sent parameters you can use above code
        manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
     // header("Content-Type: application/json");
    //    manager.requestSerializer = [AFJSONRequestSerializer serializer];

        manager.responseSerializer = [AFHTTPResponseSerializer serializer];


        [manager GET:@"your url" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) 

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

            NSString *jsonString =  [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];

            NSString *newJsonString = [jsonString stringByReplacingOccurrencesOfString:@"\\'" withString:@""];

/*
NSRange range = [jsonString rangeOfString:@"" options:NSBackwardsSearch];
jsonString = [jsonString substringToIndex:range.location + 1];
*/
            NSData *data = [newJsonString dataUsingEncoding:NSUTF8StringEncoding];

            NSError *error;
            NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

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


            if (!array) 
                NSLog(@"Parsing JSON failed: %@", error);
            

            /*
             NSData *newJSONData = [newJsonString dataUsingEncoding:NSUTF8StringEncoding];
             NSDictionary* json = [NSJSONSerialization
             JSONObjectWithData:newJSONData
             options:NSJSONReadingMutableContainers
             error:&error];
             NSLog(@"json %@",json);
            */

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


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

            NSLog(@"%@",[error description]);

        ];

在某些情况下,您需要更改响应字典/数组 - 但有时对象的所有片段都不是可变的。 为此,请执行以下操作。

字典

 NSError *error;

                NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error];

                responseDictionary = [[NSMutableDictionary alloc]init];

                responseDictionary = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error];

对于数组

NSError *error;

                NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:responce options:NSJSONWritingPrettyPrinted error:&error];

                responseArray = [[NSMutableDictionary alloc]init];

                responseArray = [NSJSONSerialization JSONObjectWithData:dataFromDict options:NSJSONReadingMutableContainers error:&error];

【讨论】:

【参考方案2】:

您似乎在服务器端有一个 ASP.NET Web API 服务。默认返回 XML。

你有两个选择:

    按照How do I get ASP.NET Web API to return JSON instead of XML using Chrome?中的说明更改 Web 服务的配置

    随请求一起发送 HTTP 标头 Accept: application/json

【讨论】:

我没有使用 ASP.NET web api,其次没有用于 HTTP 标头的代码提示选项 那么你在服务器端使用什么?如果您不使用 Accept HTTP 标头指定一种格式,它会返回什么格式? webservice 是通过 PHP-mysql 和它提供 JSON 格式的数据

以上是关于如何通过 AFNetworking 创建简单的 Http 请求的主要内容,如果未能解决你的问题,请参考以下文章

ios开发之--使用AFNetWorking 3.1.0 ,简单的请求封装类

AFNetworking.h 文件未找到当项目删除另一个 mac

ios基础篇(三十)—— AFNetworking的使用

UIImageView+Afnetworking 无法正常工作

如何通过手机sdk中的afnetworking从服务器获取数据

如何使用 AFNetworking 为请求设置 HTTP 正文?