使用AFNetworking进行API调用

时间:2013-10-03 17:20:12

标签: ios afnetworking afnetworking-2

得到一条评论,将主要问题作为单独的故障单并将每个问题分开。

我正在尝试为SDK编写代码。我需要进行API调用。

我正在使用AFNetworking 2.0向服务器发送POST请求:

NSDictionary * params = [self formDictionaryFromCard: card];

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString: [self apiUrl] parameters: params];

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"Firefox" forHTTPHeaderField:@"User-Agent"];


AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];

[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {


    successBlock(responseObject);


} failure:^(AFHTTPRequestOperation *operation, NSError *error) {


    errorBlock(error);

}];

[[NSOperationQueue mainQueue] addOperation:op];

这是使用AFNetworking为SDK进行API调用的正确方法吗? 如何为https提供支持?

1 个答案:

答案 0 :(得分:3)

  

这是使用AFNetworking为API调用的正确方法吗?   SDK?

您的代码将按原样运行。我会提出一些建议来改变它。

主队列

虽然CocoaDocs上的示例代码显示正在使用mainQueue,但请考虑是否要使用除mainQueue之外的其他NSOperationQueue。以下是一些可能的原因:

  • 如果您需要稍后查看其中一项操作(例如,如果您要取消/暂停上传)。
  • 如果您将mainQueue用于其他任何事情,并且您不希望在系统查看下一步启动的操作时将这些操作的优先级与网络操作的优先级进行比较
  • 如果您希望一次运行多个网络请求(例如,如果您希望能够同时下载照片并发布消息)。

您可以使用AFNetworking的内置操作队列(在AFHTTPRequestOperationManager上):

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager.operationQueue addOperation:op];

你也可以使用自己的一个。

在调用之前检查块

您可能需要先检查是否存在块,然后再将其命名为void crashes:

if (successBlock) {
    successBlock(responseObject);
}

避免冗余代码

如果所有 您的操作需要对标头进行这些自定义,则可能更容易将AFHTTPRequestOperationManager子类化,并覆盖HTTPRequestOperationWithRequest: success: failure:以添加标头那里。然后,您可以使用AFHTTPRequestOperationManager的便捷方法(以POSTGET开头的方法)。

看看the documentation for AFHTTPRequestOperationManager

  

如何为https提供支持?

对于大多数用途,只需在您的网址中加入https(在您的情况下,在[self apiUrl]中)。对于特定用途,例如允许无效证书或仅接受特定证书,您需要查看AFSecurityPolicy类。