如何使用 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-Type
或text/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 为请求设置 HTTP 正文?