使用 AFNetworking 2.0 访问 DailyMile API

Posted

技术标签:

【中文标题】使用 AFNetworking 2.0 访问 DailyMile API【英文标题】:Accessing DailyMile API with AFNetworking 2.0 【发布时间】:2013-12-09 20:27:16 【问题描述】:

所以我正在从 https 站点发出 JSON 请求(在检索身份验证令牌之后),就像 AFNetworking 堆栈溢出的其他十几个问题一样,我收到了这个错误:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) 

UserInfo=0x8dc2860 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

我用来发出这个请求的代码是这样的:

AFHTTPRequestSerializer *requestSerializer = [AFHTTPRequestSerializer serializer];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

//Set auth header...
NSString *accessToken = [[[self.dailymileAuthentication oauthClient] accessToken] accessToken];
[requestSerializer setAuthorizationHeaderFieldWithToken:accessToken];

AFHTTPRequestOperationManager *requestManager = [AFHTTPRequestOperationManager manager];

[requestManager setRequestSerializer:requestSerializer];
[requestManager setResponseSerializer:[AFJSONResponseSerializer serializer]];

[requestManager GET:[profileURL description]
         parameters:nil
            success:^(AFHTTPRequestOperation *operation, id response) 
                NSLog(@"JSON: %@", response);
            
            failure:^(AFHTTPRequestOperation *operation, NSError *error) 
                NSLog(@"Error: %@", error);
            ];

网址是: https://api.dailymile.com/people/me.json

如果有人有兴趣查看完整的代码库,我正在研究一个公共 GitHub 存储库(注意:您不需要 来理解问题,这只是可选的): https://github.com/thepost/Dailymile-ios

我需要做什么才能发出经过身份验证的 JSON 请求?

我不知道我是否正确使用了 AFNetworking。老实说,目前还没有很多关于 AFNetworking 2 的文档。

【问题讨论】:

错误发生在哪里,在request中还是在response序列化中?请注意:也许您会发现更适合的较低级别的 API(我也是)。那些超级方便的网络请求方法只会迫使你检查每一个来源以了解到底发生了什么。 api.dailymile.com/people/me.json 在浏览器中访问时为我返回 404。 @moby,您必须登录 dailymile.com,然后访问该 API URL 应该会以 JSON 格式提供您的个人资料。 @CouchDeveloper 错误发生在故障块中。我同意,我认为我什至不再需要 AFNetworking。 NSURLSession 替代了 iOS 中的很多缺点,我没用过,但是在这里查看:raywenderlich.com/51127/nsurlsession-tutorial 您对 AFNetworking 2.0 缺乏文档的评论让我感到惊讶。你没见过cocoadocs.org/docsets/AFNetworking/2.0.3 吗? 【参考方案1】:

我不确定是什么引起了混淆;错误很明显:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x8dc2860 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

来自 DailyMile 的 JSON 响应无效,因为它没有数组或对象作为其根值。

如果该值确实是 JSON,并且应该被解析为 JSON,您可以set the readingOptions of the responseSerializer 允许分片。

不过,我怀疑您的 API 端点实际上并未返回 JSON,而是带有错误 Content-Type 标头的纯文本响应。

【讨论】:

你是对的,它没有返回 JSON,但这不是混淆。它正确地返回带有错误消息的 html 正文,因为它将其解释为未经身份验证的请求。困惑是如何发出经过身份验证的请求。如何在需要访问令牌时发出 GET 请求... 这更多地与 DailyMile API 相关,而不是 AFNetworking。快速浏览their API documentation 会发现他们正在错误地实施 OAuth。他们期待的是 oauth_token 参数,而不是标题,例如https://api.dailymile.com/people/me.json?oauth_token=<ACCESS_TOKEN> 错误哇。这就是为什么我不应该处理网络电话。或者也许这就是为什么我应该在网络上做更多的事情:-|谢谢!现在可以使用访问令牌作为参数了 我自己也在处理类似的问题。发生的情况是,程序员错误或对如何在 front side 上使用 AFNetworking 的误解导致在 back side 上返回错误。有一段时间,您试图找出背面出了什么问题,却没有意识到真正的问题出在正面。 嘿 Travis(或其他任何人),如果您的问题也与使用带有 Dailymile API 的 AFNetworking 相关,那么我正在开发的库现在可以使用:github.com/thepost/Dailymile-iOS

以上是关于使用 AFNetworking 2.0 访问 DailyMile API的主要内容,如果未能解决你的问题,请参考以下文章

带有 OAuth2 令牌的 AFNetworking 2.0

iOS网络访问之使用AFNetworking

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

AfNetworking 2.0 发布问题

AFNetworking 2.0 - 是不是使用子类?

AFNetworking 2.0,使用 NSURLSession 下载图片