1

得到评论以使主要问题成为单独的票证并将每个问题分开。

我正在尝试为 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 提供支持?

4

1 回答 1

3

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

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

主队列

尽管 CocoaDocs 上的示例代码显示mainQueue正在使用,但请考虑是否要使用不同的 NSOperationQueue mainQueue。以下是一些可能的原因:

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

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

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

您也可以使用自己的一种。

在调用它们之前检查块

您可能需要在调用它们以使崩溃无效之前检查是否存在块:

if (successBlock) {
    successBlock(responseObject);
}

避免冗余代码

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

查看AFHTTPRequestOperationManager 的文档

如何为 https 提供支持?

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

于 2013-10-03T22:27:16.993 回答