AFNetworking 数据参数为 nil JSON 数据
AFNetworking Data Parameter is nil JSON Data
我有一个 UITableViewController,我正在尝试使用此代码从 url 获取 JSON 数据,但我得到的是 error.What 我应该怎么做?
AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
[securityPolicy setAllowInvalidCertificates:YES];
NSString *urlPath = [NSString stringWithFormat:@"http://testurl.com/api/index.php"];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""};
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager setSecurityPolicy:securityPolicy];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData *jsonData = [NSData dataWithContentsOfFile:string];
NSError *error = nil;
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
self.customerCards = [NSMutableArray array];
NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"];
for (NSDictionary *customersDictionary in customersArray) {
ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]];
customer.tel = [customersDictionary objectForKey:@"tel"];
[self.customerCards addObject:customer];
}
NSLog(@"GET: %@", string);
NSLog(@"POST: %@", parameters);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
这是错误集团
2015-03-26 14:27:37.656 SaphiraCrm[13770:3881729] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
我认为问题可能在于您将 responseObject
视为 NSData
,但根据 AFNetworking
examples,默认情况下AFHTTPRequestOperationManager
的 responseSerializer
是一个 AFJSONResponseSerializer
,因此 responseObject
已经是一个解析的 JSON,表示为 NSDictionary
(取决于序列化程序)。
因此,行
NSString *string = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding];
returns nil
,导致下一行
NSData *jsonData = [NSData dataWithContentsOfFile:string];
引发异常。
我建议您检查 responseObject
是否符合您的预期,并相应地重构您的代码。
...
[manager POST:urlPath
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (responseObject) {
NSLog(@"Response is a %@ and contains: %@", [responseObject class], responseObject);
// Process responseObject according to its type
...
注:
上面的情况很可能只是您之前设置序列化器配置方式错误的结果,因为您先设置 acceptableContentType
然后用默认设置覆盖它。
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
...
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// this is likely to invalidate the previous, since you overwritting
// the manager's serializer with a new one with default configuration.
好的,我知道我该怎么做了。
有我的代码
AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
[securityPolicy setAllowInvalidCertificates:YES];
NSString *urlPath = [NSString stringWithFormat:@"http://test.com/api/index.php"];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""};
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager setSecurityPolicy:securityPolicy];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSError *error = nil;
NSData *jsonData = [string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
self.customerCards = [NSMutableArray array];
NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"];
NSLog(@"%@",customersArray);
for (NSDictionary *customersDictionary in customersArray) {
ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]];
customer.tel = [customersDictionary objectForKey:@"tel"];
[self.customerCards addObject:customer];
}
[self.tableView reloadData];
NSLog(@"GET: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
我有一个 UITableViewController,我正在尝试使用此代码从 url 获取 JSON 数据,但我得到的是 error.What 我应该怎么做?
AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
[securityPolicy setAllowInvalidCertificates:YES];
NSString *urlPath = [NSString stringWithFormat:@"http://testurl.com/api/index.php"];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""};
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager setSecurityPolicy:securityPolicy];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSData *jsonData = [NSData dataWithContentsOfFile:string];
NSError *error = nil;
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
self.customerCards = [NSMutableArray array];
NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"];
for (NSDictionary *customersDictionary in customersArray) {
ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]];
customer.tel = [customersDictionary objectForKey:@"tel"];
[self.customerCards addObject:customer];
}
NSLog(@"GET: %@", string);
NSLog(@"POST: %@", parameters);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
这是错误集团
2015-03-26 14:27:37.656 SaphiraCrm[13770:3881729] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'
我认为问题可能在于您将 responseObject
视为 NSData
,但根据 AFNetworking
examples,默认情况下AFHTTPRequestOperationManager
的 responseSerializer
是一个 AFJSONResponseSerializer
,因此 responseObject
已经是一个解析的 JSON,表示为 NSDictionary
(取决于序列化程序)。
因此,行
NSString *string = [[NSString alloc] initWithData:responseObject
encoding:NSUTF8StringEncoding];
returns nil
,导致下一行
NSData *jsonData = [NSData dataWithContentsOfFile:string];
引发异常。
我建议您检查 responseObject
是否符合您的预期,并相应地重构您的代码。
...
[manager POST:urlPath
parameters:parameters
success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (responseObject) {
NSLog(@"Response is a %@ and contains: %@", [responseObject class], responseObject);
// Process responseObject according to its type
...
注:
上面的情况很可能只是您之前设置序列化器配置方式错误的结果,因为您先设置 acceptableContentType
然后用默认设置覆盖它。
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
...
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// this is likely to invalidate the previous, since you overwritting
// the manager's serializer with a new one with default configuration.
好的,我知道我该怎么做了。
有我的代码
AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
[securityPolicy setAllowInvalidCertificates:YES];
NSString *urlPath = [NSString stringWithFormat:@"http://test.com/api/index.php"];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"process":@"search_customer",@"page": @""};
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[manager setSecurityPolicy:securityPolicy];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:urlPath parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSError *error = nil;
NSData *jsonData = [string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
self.customerCards = [NSMutableArray array];
NSArray *customersArray = [dataDictionary objectForKey:@"musteri_list"];
NSLog(@"%@",customersArray);
for (NSDictionary *customersDictionary in customersArray) {
ApiClass *customer = [ApiClass customersWithTitle:[customersDictionary objectForKey:@"adi"]];
customer.tel = [customersDictionary objectForKey:@"tel"];
[self.customerCards addObject:customer];
}
[self.tableView reloadData];
NSLog(@"GET: %@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];