如何使用 AFNetorking 和 NSURLRequest 发出 HTTP 请求?

Posted

技术标签:

【中文标题】如何使用 AFNetorking 和 NSURLRequest 发出 HTTP 请求?【英文标题】:How to make an HTTP request with AFNetorking and NSURLRequest? 【发布时间】:2015-04-01 22:19:18 【问题描述】:

我正在尝试使用 AFHTTPRequestOperationManager 发出 HTTP 请求。我需要使用 AFHTTPRequestOperationManager 因为我希望能够在必要时取消所有操作。由于某种原因,我无法使其正常工作。不调用完成块。我错过了什么吗?

 NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://twitter.com/%@", username]];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:@"MyUserAgent (iPhone; ios 7.0.2; gzip)" forHTTPHeaderField:@"User-Agent"];
    [request setHTTPMethod:@"GET"];

    [self.manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) 
        NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        if ([html containsString:@"var h = decodeURI(l.hash.substr(1)).toLowerCase();"]) 
            completion(YES, nil);
         else 
            completion(NO, nil);
        
     failure:^(AFHTTPRequestOperation *operation, NSError *error) 
        completion(NO, error);
    ];

【问题讨论】:

【参考方案1】:

这是工作代码,您需要在那里使用 GET 或 POST 方法。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

NSDictionary *params = @@"email":emailfield.text;

[manager GET:@"http://example.com/api" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSLog(@"JSON: %@", responseObject);
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    NSLog(@"Error: %@", error);
];

【讨论】:

【参考方案2】:

虽然其他人都是对的——你应该使用现代的 AFNetworking 结构而不是旧功能——有一种快速的方法来完成你想要完成的事情。

从表面上看,- (??? *) HTTPRequestOperationWithRequest:success:failure 方法很可能返回一个AFHTTPRequestOperation。如果我是正确的,您只需要实际开始操作。请参阅下面的代码,已更正。

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://twitter.com/%@", username]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"MyUserAgent (iPhone; iOS 7.0.2; gzip)" forHTTPHeaderField:@"User-Agent"];
[request setHTTPMethod:@"GET"];

AFHTTPRequestOperation *op = [self.manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) 
    NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    if ([html containsString:@"var h = decodeURI(l.hash.substr(1)).toLowerCase();"]) 
        completion(YES, nil);
     else 
        completion(NO, nil);
    
 failure:^(AFHTTPRequestOperation *operation, NSError *error) 
    completion(NO, error);
];

[op start];

【讨论】:

我试图以这种奇怪的方式来做这件事,因为我对所有事情都使用了共享管理器,因此如果需要,我可以一次取消所有异步操作,这实际上是我非常需要的功能应用程序。但是,我刚刚决定创建第二个经理,它具有我想要的单独标题字段。谢谢。【参考方案3】:

HTTPRequestOperationWithRequest 方法返回 AFHTTPRequestOperation。您必须将其添加到某个操作队列才能启动它。例如

AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request .........
[[NSOperationQueue currentQueue] addOperation:operation];

您可以使用比 AFHTTPRequestOperationManager 好一点的 AFHTTPSessionManager 并使用 NSURLSessionDataTask 的方法 cancel 取消请求。你可以在这里找到一些代码示例 - AFNetworking 2.0 cancel specific task

【讨论】:

【参考方案4】:

检查这是否可行

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 

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

];

【讨论】:

以上是关于如何使用 AFNetorking 和 NSURLRequest 发出 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

iOS HTTPS 请求 101

iOS:AFNetworking 的可达性

AFNetworking 可达性 iOS

如何使用 php 和 mysql 使用纬度和经度进行几何搜索

如何查看手机内存和CPU使用情况

如何接收和使用 NSErrorPointer