如何通过 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
UIImageView+Afnetworking 无法正常工作