如何使用AFNetworking 2设置HTTP请求?

4
我可以帮您进行翻译。以下是您需要翻译的内容:

我需要发送普通的HTTP请求(GET方法), 并且响应以text/html形式返回。如何使用AFNetworking 2发送这样的请求?

目前我正在尝试使用:

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com"]];
[self HTTPRequestOperationWithRequest:request
                              success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                  NSLog(@"JSON: %@", responseObject);
                              } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                  NSLog(@"Error: %@", error);
                              }];

我遇到了一个很让人沮丧的问题-它什么也没做。在调试时,无论成功还是失败的代码块都没有被触发。

我还尝试使用GET:parameters:success:failure:方法,但响应中出现了以下错误:

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html"

请问有人能解释一下这是什么问题,如果我收到以text / html形式响应的话,正确的请求方式是什么呢?

谢谢,Alex。


你尝试过使用http而不是https吗? - vaibhav_15
我需要https。但我认为这并不重要。 - LIAL
2个回答

17

在回复建议使用 AFHTTPRequestOperationManager 时,您在评论中说:

当我使用GET方法时,我得到了如上所述的错误:Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html"

您可以通过使用 AFHTTPResponseSerializer 来解决这个问题:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"https://example.com" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    // do whatever you'd like here; for example, if you want to convert 
    // it to a string and log it, you might do something like:

    NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

你也可以使用AFHTTPRequestOperation

NSOperationQueue *networkQueue = [[NSOperationQueue alloc] init];
networkQueue.maxConcurrentOperationCount = 5;

NSURL *url = [NSURL URLWithString:@"https://example.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // do whatever you'd like here; for example, if you want to convert 
    // it to a string and log it, you might do something like:

    NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%s: AFHTTPRequestOperation error: %@", __FUNCTION__, error);
}];
[networkQueue addOperation:operation];

理想情况下建议编写返回 JSON(或 XML)的服务器代码,因为这对应用程序来说更易于消费和解析。


1
非常感谢你,Rob。这真的很有帮助。 - LIAL
这是AFNetworking鼓励我们使用的方式吗?代码的第一部分很简单,但我找不到AFNetworking教授这种方法。 :( 我只是怀疑为什么AFNetworking没有教我使用它来发送一个简单的GET请求。 - dondonhk
是的,将responseSerializer设置为与预期响应格式匹配是推荐的方法。AFNetworking没有教你使用ATHTTPResponseSerializer的原因是,通常不应编写返回Content-Typetext/html的JSON响应的Web服务!在LIAL的问题中,他明确指出他期望JSON响应,但他的Web服务响应未能适当地设置Content-Type头。如果Web服务返回JSON,则应相应地设置其标头(例如,在PHP中,header("Content-Type: application/json"))。 - Rob
请注意,这个答案是针对AFNetworking 2.x编写的。在后续版本中,您将不再使用AFHTTPRequestOperationManagerAFHTTPRequestOperation。但是,在AFHTTPSessionManager中,responseSerializer的设置方式是相同的。但是,正如我所说,如果Web服务适当地设置其响应头以获取JSON响应有效负载,您就不必干扰responseSerializer - Rob

1
//AFN 2.0 is just support IOS 7,and it's standard use as follow:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://example.com/resources.json" 
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
               NSLog(@"JSON: %@", responseObject)
     }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
               NSLog(@"Error: %@", error);
     }
];

当我使用GET时,我得到了如上所述的错误:错误:错误域=AFNetworkingErrorDomain Code=-1016“请求失败:不可接受的内容类型:text / html” - LIAL
1
请在代码中添加 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; ,这样服务器响应内容为 text/html 时,管理器才能正确解析。 - Rob
是的,已经完成了。我只需要将获取到的行数据转换为可读字符串即可。 - LIAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接