Ios AFFDATA;registerHTTPOperationClass出现问题

Ios AFFDATA;registerHTTPOperationClass出现问题,ios,afnetworking,Ios,Afnetworking,我是AFNetworking新手,正在调用一个简单的登录api,该api返回类似json的内容: {"status":"success","data":{"auth_token":"12jt34"}} 我正在通过以下方式进行操作,但它返回的是u NSCFData,而不是我可以处理的东西 NSURL *baseURL = [NSURL URLWithString:@"http://localhost:3000/arc/v1/api/"]; AFHTTPClient *httpClient = [

我是AFNetworking新手,正在调用一个简单的登录api,该api返回类似json的内容:

{"status":"success","data":{"auth_token":"12jt34"}}
我正在通过以下方式进行操作,但它返回的是u NSCFData,而不是我可以处理的东西

NSURL *baseURL = [NSURL URLWithString:@"http://localhost:3000/arc/v1/api/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient defaultValueForHeader:@"Accept"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        uname,@"email", pwd, @"password",
                        nil];
[httpClient postPath:@"login-mobile" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *className = NSStringFromClass([responseObject class]);
    NSLog(@"val: %@",className);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error retrieving data: %@", error);
}];
它输出:

2013-03-21 14:52:51.290 FbTabbed[21505:11303] val: __NSCFData
但我希望它能成为一本我可以操作的字典,这就是我认为它应该如何工作的?我做错了什么

我做错了什么

你在做假设。更糟糕的是,你根本不需要阅读文档<代码>NSStringFromClass()不是魔法。它返回作为
NSString
对象传入的类的名称。如果您想用返回的JSON字符串生成一个字典,那么您必须解析它,例如使用
NSJSONSerialization

[httpClient defaultValueForHeader:@"Accept"];
应该是:

[httpClient setDefaultHeader:@"Accept" value:@"application/json"];

是,
responseObject
是一个
NSData
。然后,您可以使用
NSJSONSerialization
方法
JSONObjectWithData
将其解析为字典或数组:

NSURL *baseURL = [NSURL URLWithString:@"http://localhost:3000/arc/v1/api/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient defaultValueForHeader:@"Accept"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        uname,@"email", pwd, @"password",
                        nil];
[httpClient postPath:@"login-mobile" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSAssert([responseObject isKindOfClass:[NSData class]], @"responseObject is supposed to be a NSData"); // it should be a NSData class

    NSError *error;
    self.results = [NSJSONSerialization JSONObjectWithData:responseObject
                                                   options:0
                                                     error:&error];
    if (error != nil)
    {
        // handle the error

        // an example of the sort of error that could result in a parse error 
        // is if common issue is that certain server errors can result in an
        // HTML error page (e.g. you have the URL wrong, your server will 
        // deliver a HTML 404 page not found page). If you want to look at the 
        // contents of the `responseObject`, you would:
        //
        // NSLog(@"responseObject=%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    }
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error retrieving data: %@", error);
}];


显然,您的
results
对象将是
NSDictionary
NSArray
,这取决于您从API得到的响应类型。

请解释(错误的)否决票。人们不喜欢真相吗?或者“不要听我说什么,明白我的意思吗?”@H2CO3我没有否决投票,但我猜这是因为你回答的语气,这是不必要的讽刺。我不知道你为什么不厌其烦地建议timpone一定认为
NSStringFromClass
很神奇,或者他一定没有读过任何文档。这是一个无辜的误会。别误会我的意思:我喜欢你积极主动,乐于助人,但是,我知道,你经常不必要地咆哮。(值得注意的是,我认为你关于无辜误用xcode标记的评论是粗鲁的。我们想帮助你,而不是贬低你。)如果你想讽刺的话,可以讽刺,但要接受反对票。@H2CO3 1。我们只能同意在这一点上有不同意见这一点在Meta上讨论得更好(并且已经详尽地讨论过了;一致认为这是否决投票的有效理由)。就像我说的,我并没有否决投票,但我能理解为什么有人会这么做。2.我发现timpone试图
NSLog
一个参数的类名(尤其是
id
类型)是一种完全合乎逻辑(尽管不完整)的诊断技术,而不是对魔法的错误信念或阅读文档的失败。我只会建议timpone采取下一步,并将其转换为
NSString
,然后检查它。thx Rob,我以NSString和Iskindof类的形式输出。老实说,我们只是想找出一个开发人员所做的一些代码。我提供的答案是我正在寻找的,效果很好。
我做错了什么?
不是关于NSStringFromClass的,我认为这应该从问题中显而易见。显然,这不是问题不,这不是问题所在。问题是我刚才描述的。尽管投了反对票,但这是可行的。AFNetworking将为您反序列化。我遇到了相同的问题,它解决了问题。我建议使用
AFHTTPClient
通过调用
requestWithMethod:path:parameters:
,创建
NSURLRequest
,然后使用
AFJSONRequestOperation
发出请求并返回JSON.thx Isaac-它们到达了相同的点吗;我认为将registerHTTPOperationClass设置为AFJSONRequestOperation可以实现这一点。如果您知道得更清楚,您会感兴趣的。看起来您正在发出POST请求,听起来您希望返回JSON。通过使用类似于
NSURLRequest*request=[httpClient requestWithMethod:@“POST”path:@“login mobile”参数:params]的内容创建请求,您完全可以做到这一点,并使用相同的
httpClient
对象及其所有设置;[AFJSONRequestOperation JSONRequestOperationWithRequest:请求成功:^{}失败:^{}](根据需要填写这些块)。是的,所以您所描述的是正确的发送post'd数据并返回json。老实说,我们处理这个的主要对象是分开的,这只是为了检查一个api端点(因此,管理httpClient_389;没有真正的问题。我认为手动设置下面的标题值是可行的。它可以很好地工作,但我确信可以直接完成。如果不需要设置标题,您可能可以直接使用
AFJSONRequestOperation
;如果您在每次使用的基础上设置标题,则可以生成
NSURL。)请求
并在其上设置标题,然后将其输入到
AFJSONRequestOperation
,与我之前在
httpClient
中描述的相同,只是没有
httpClient
部分。谢谢您的回答。如果您更改我设置为答案的呼叫,AFJSONRequestOperation现在将完成所有这些。@timpone我恐怕不知道ot跟踪你。你解决了你的问题吗?我本以为我上面的回答,或者更好的是,Isaac建议使用
AFJSONRequestOperation
,会解决这个问题。我不清楚你是否还有一个悬而未决的问题。对于后续问题,我回答了哪一个对发布和获取json有效。它非常有效基本上,NSArray或NSDictionary都会还给你。我想H2CO3会把它作为我接受的答案取消。算了吧——我太忙了,没时间和他打交道(自从我问这个问题以来,我已经用了一个完整的auth系统)@timpone lol。这就是我所困惑的。我怀疑是否有人“取消”答案,但它只是没有“接受”.如果你真的想接受他的答案,我会鼓励你这么做(否则这个问题就悬而未决了).你的电话。不管怎样,我很高兴你解决了你的问题并继续前进。我喜欢它!thx@Rob非常确定答案是未确定的,因为我接受了它,他编辑了它,现在它没有被设置为答案;不管怎样,我对你的答案投了更高的票。这只是一个非常简单的语法问题,不是什么问题