【问题标题】:AFNetworking: Can't get the response string from AFHTTPRequestOperationAFNetworking:无法从 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... 很奇怪吧?感谢您的回复:-)

标签: ios networking afnetworking nsurlrequest


【解决方案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;
    }
    

    【讨论】:

    • "Ø" 是丹麦语。瑞典语版本是“Ö”。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多