AFNetworking:无法从 AFHTTPRequestOperation 获取响应字符串
Posted
技术标签:
【中文标题】AFNetworking:无法从 AFHTTPRequestOperation 获取响应字符串【英文标题】:AFNetworking: Can't get the response string from AFHTTPRequestOperation 【发布时间】:2012-12-11 00:43:06 【问题描述】:有人吗?):在过去的 2 个小时里,我遇到了一个让我摸不着头脑的问题,这很可能是我错过的一个非常简单的愚蠢事情。当我从操作@AFNetworking 调用响应字符串时,我不断收到构建错误......就像没有这样的财产......
请查看我的代码并解释我这次搞砸了什么:p.. 谢谢 :)
NSDictionary* paramDict = [NSDictionary dictionaryWithObjectsAndKeys:WebServicemd5Value, WebSermd5Variable, nil]
;
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:webServiceURL]];
[httpClient defaultValueForHeader:@"Accept"];
[httpClient postPath:@"method" parameters:paramDict success:^(AFHTTPRequestOperation *operation, id responseObject)
NSLog(@"Response data: %@", responseObject);
NSLog(@"Reponse String: %@", operation);
// 打印操作会显示操作字典,包括响应字段,// 但是当我直接调用 operation.response 时,编译器不会构建,说明 // “AFHTTPRequestOperation 找不到属性”.. .. 最奇怪的事情,对吧?
NSString* responseString = [NSString stringWithUTF8String:[responseObject bytes]];
//.. Rest o f my Code....
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error retrieving data: %@", error);
];
【问题讨论】:
我想在 NSLOG 中简单地打印 operation.response 而不是操作本身... 你是说,当你做 NSLog(@"Response object %@",operation.response); - 编译器抱怨,但是当你做 NSLog(@"Operation object %@",operation);它打印并且它具有响应作为其元素之一。你的控制台输出是什么。 您是否尝试过打印出单独的操作响应?例如打印出状态码NSLog(@"Operation response status = %@", [NSHTTPURLResponse localizedStringForStatusCode:operation.response.statusCode]);
@Srinkanth - 控制台输出是一系列十六进制数字......不像我预期的那样真的是字典......谢谢
@Adam Johnson:就是这样...我无法访问 operation.response,也无法访问 operation.response.statusCode... 很奇怪吧?感谢您的回复:-)
【参考方案1】:
Hernan,如果您希望从 JSON 响应中获得 NSDictionary
,您应该考虑使用 AFJSONRequestOperation
,因为您会在成功回调中获得 JSON 字典。无论如何,如果您想从您的responseObject
获取字典,请尝试使用以下代码:
NSError *error = nil;
NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:&error];
if (error)
NSLog(@"Error serializing %@", error);
NSLog(@"Dictionary %@", JSON);
【讨论】:
hi Amb:感谢您的回复,伙计...我肯定会尝试响应对象的 NSJSONSerialization,是否按原样放置?还是应该将其转换为 UTF8 字符串? [NSString stringWithUTF8String:[responseObject bytes]].... 好吧,我试过了,但是服务器返回给我一个 JSON 解析器无法解析的响应。我得到:2012-12-16 19:17:14.536 Vidac[3561 :19d03] 序列化错误 错误域 = NSCocoaErrorDomain 代码 = 3840“操作无法完成。(可可错误 3840。)”(字符 0 周围的值无效。) UserInfo = 0x94917d0 NSDebugDescription = 字符 0 周围的值无效。打印responseObject 的描述: 2012-12-16 19:17:42.592 Vidac[3561:19d03] 字典(空) 您的服务器端似乎没有正确返回有效的 JSON 对象,或者您的编码有一些问题。尝试复制并粘贴您的 JSON 字符串响应,并使用验证器检查一切是否正常。另外,检查 NSJSONSerialization 选项。【参考方案2】:我相信响应字符串在“操作”对象内,所以类似于:
...
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error retrieving data: %@", operation.responseString);
];
【讨论】:
【参考方案3】:在尝试使用 AFNetworking 从 meetup.com api 检索内容时(感谢 Mattt T. 提供了一个很棒的框架,顺便说一句),遇到了同样的错误 - “操作无法完成。(Cocoa 错误 3840)” .意识到我遇到的问题是包含瑞典字符“Ø”的响应数据,导致解析错误。解决方案是在 AFNetworking 客户端的初始化中包含标头“Accept-Charset: utf-8”。已修复!
- (id)initWithBaseURL:(NSURL *)url
self = [super initWithBaseURL:url];
if (!self)
return nil;
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
// Accept HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
[self setDefaultHeader:@"Accept" value:@"application/json"];
[self setDefaultHeader:@"Accept-Charset" value:@"utf-8"];
return self;
【讨论】:
"Ø" 是丹麦语。瑞典语版本是“Ö”。 :)以上是关于AFNetworking:无法从 AFHTTPRequestOperation 获取响应字符串的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 2.0 发送 POST 数据
Afnetworking 返回 null json 尽管它是有效的
使用 AFNetworking 2 和可达性没有互联网连接警报
如何使用 AFNetworking 通过 Post 请求在服务器上发送 NSData?