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?

AFNetworking:无法从 AFHTTPRequestOperation 获取响应字符串

网络连接丢失。NSURLErrorDomain Code=-1005