在AFNetworking中,httpbody和参数post请求之间的区别



首先使用httpbody:

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:@"url" parameters:nil error:nil];
req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPBody:da];
[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (!error) {
        NSLog(@"Reply JSON: %@", responseObject);
    } else {
        NSLog(@"Error: %@, %@, %@", error, response, responseObject);
    }
}] resume];

第二个参数:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager POST:@"https://exmaple.com/post.php" parameters:json progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"Error: %@", error);
}];

这两种post方法有什么不同?我注意到一个不同的是参数一个将使用url编码方法来编码数据,而另一个将传递原始数据。

第一个方法用于将单个原始数据块传递给服务器的情况。

  • 向CGI发送JSON数据
  • 发送url编码或表单数据编码格式的预编码正文数据
  • 向支持WebDAV的服务器发送PUT请求中的文件数据。

第二个方法(提供一系列参数)旨在通过将正文数据提供为一系列url编码的键值对来模拟表单提交。对于大多数非基于json的CGI工作,这是你想要的。

使用哪一个的决定很大程度上取决于服务器端发生了什么。如果脚本期望主体数据是一个JSON blob,那么将JSON数据编码为NSData对象并将其作为主体数据发送。如果脚本期望得到HTML表单的结果,则使用另一种方法。如果脚本不在乎,则使用平均发送较少数据的方法。: -)

最新更新