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

Posted

技术标签:

【中文标题】如何使用 AFNetworking 2 设置 HTTP 请求?【英文标题】:How to set HTTP request using AFNetworking 2? 【发布时间】:2013-11-09 12:21:49 【问题描述】:

我需要发送普通的 HTTP 请求 (GET) 并以 text/html 形式回答。 如何使用 AFNetworkin 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);
                              ];

而且很沮丧——它什么也没做。调试时,也没有触发success or fail子句。

我也尝试使用 GET:parameters:success:failure: 方法,但作为响应我看到了这个错误:

错误:错误域=AFNetworkingErrorDomain 代码=-1016 "请求 失败:不可接受的内容类型:text/html"

拜托,任何人都可以解释我有什么问题以及发送请求的正确方法是什么(如果我会得到文本/html的响应)?

问候,亚历克斯。

【问题讨论】:

你试过用http代替https吗? 我需要 https。但我觉得没关系 【参考方案1】:

您在评论中说,响应使用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)的服务器代码,因为这样更容易让应用使用和解析。

【讨论】:

非常感谢 Rob,它真的很有帮助。 是 AFNetworking 鼓励我们使用的方式吗?第一段代码很简单,但我找不到 AFNetworking 正在教这个。 :(。我只是怀疑为什么 AFNetworking 不教我用它来发送一个简单的 GET 请求 是的,设置responseSerializer 以匹配预期响应的格式是推荐的方式。 AFNetworking 之所以不教您使用ATHTTPResponseSerializer,是因为您通常不应该编写一个返回JSON 响应的Web 服务,其响应为Content-Typetext/html!在 LIAL 的问题中,他清楚地表明他期待 JSON 响应,但他的 Web 服务的响应未能正确设置 Content-Type 标头。如果 Web 服务返回 JSON,它应该相应地设置其标头(例如,在 php 中,header("Content-Type: application/json"))。 请注意,此答案是为 AFNetworking 2.x 编写的。在以后的版本中,您既不会使用AFHTTPRequestOperationManager,也不会使用AFHTTPRequestOperation。但是responseSerializer 的设置在AFHTTPSessionManager 中的工作方式相同。但是,正如我所说,如果 Web 服务为 JSON 响应负载适当地设置其响应标头,则您根本不必与 responseSerializer 混淆。【参考方案2】:
//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 时,我收到了上面写的这个错误:Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" @LIAL 添加manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 让它知道您将接受text/html 响应。 是的,已经完成了。只需将我得到的行数据转换为可读字符串。

以上是关于如何使用 AFNetworking 2 设置 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在上传带参数的图像时使用 AFNetworking 2.0 设置 cookie?

如何设置 AFNetworking 2.0 默认标头?

如何使用 AFNetworking 为请求设置 HTTP 正文?

如何使用 AFNetworking 为“PUT”请求设置数据?

无法使用 AFNetworking 发出 POST 请求

JSONRequest 的 AFNetworking 问题