得到一条评论,将主要问题作为单独的故障单并将每个问题分开。
我正在尝试为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提供支持?
答案 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的便捷方法(以POST
和GET
开头的方法)。
看看the documentation for AFHTTPRequestOperationManager。
如何为https提供支持?
对于大多数用途,只需在您的网址中加入https
(在您的情况下,在[self apiUrl]
中)。对于特定用途,例如允许无效证书或仅接受特定证书,您需要查看AFSecurityPolicy类。