文章包涵AFNetworking、NSMutableURLRequest两种请求方式:get、post、上传图片、解决上传base64编码图片过长问题(使用【2、post 第一种配置】即可解决)
比如报错:err:Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: too long (414)"
一、AFNetworking篇
1、get
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//申明返回的结果是json类型
manager.responseSerializer=[AFJSONResponseSerializer serializer];
//申明请求的数据是json类型
manager.requestSerializer=[AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// [self.HUD showLoading];
//请求时带请求头
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// 设置header
NSString *header = @"自定义header格式";
[manager.requestSerializer setValue:header forHTTPHeaderField:kHeaderKey];
__weak typeof(self) weakSelf = self;
[manager GET:url parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"+++++%@",result);
NSDictionary *dic = [weakSelf dictionaryWithJsonString:result];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
2、post 第一种配置
NSString *url = @"http://···········";
// 特别说明:像base64编码后的图片比较大,使用这种方式即可
NSDictionary *paramDic = @{
@"base64Str":imageStr,
@"number":@"12344",
@"name":name,
@"key":@"key",
};
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
__weak typeof(self) weakself = self;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"image/png",nil];
[self.HUD showLoading];
[manager POST:url parameters:paramDic success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"+++++%@",result);
NSDictionary *object = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"++++++ %@",error);
}];
3、post 第二种配置。 与【2】基本一致
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//申明返回的结果是json类型
manager.responseSerializer=[AFJSONResponseSerializer serializer];
//申明请求的数据是json类型
manager.requestSerializer=[AFJSONRequestSerializer serializer];
//请求时带请求头
__weak typeof(self) weakself = self;
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[manager POST:URL parameters:nil progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
4、post 上传图片
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//申明返回的结果是json类型
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",@"image/png",nil];
//提交数据及文件(图片、其他格式文件)
[manager POST:kAddFeedbackURL parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
// 在此处添加要发送的文件 (原理:block回调)
[formData appendPartWithFileData:nil name:nil fileName:nil mimeType:@"application/octet-stream; charset=UTF-8"]; //image/jpeg
[formData appendPartWithFileData:photoData2 name:@"img2" fileName:fileName2 mimeType:@"image/jpeg"];
}
progress:^(NSProgress * _Nonnull uploadProgress) {
// 进度条
NSLog(@"service progress...");
}
success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
if (responseObject != nil) {
NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
}
}
failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"POST Error: %@", error.description);
}
];
二、原生方法:NSMutableURLRequest、NSURLSessionDataTask
// 1.创建一个网络路径
NSURL *url = [NSURL URLWithString:@"http://----"];
// 2.创建一个网络请求,分别设置请求方法、请求参数
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
NSString *args = [NSString stringWithFormat:@"memberId=%@&content=%@",PhoneNumber,content];
request.HTTPBody = [args dataUsingEncoding:NSUTF8StringEncoding];
// 设置header
NSString *header = @"自定义header格式";
[request setValue:header forHTTPHeaderField:kHeaderKey];
// 3.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];
// 4.根据会话对象,创建一个Task任务
__weak typeof(self) weakSelf = self;
[self.HUD showLoading];
NSURLSessionDataTask *sessionDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"从服务器获取到数据");
/*
对从服务器获取到的数据data进行相应的处理.
*/
// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableLeaves) error:nil];
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"+++++%@",result);
NSDictionary *dic = [weakSelf dictionaryWithJsonString:result];
[self performSelectorOnMainThread:@selector(handleResponeDetailInfo:) withObject:dic waitUntilDone:NO];
}];
//5.最后一步,执行任务,(resume也是继续执行)。
[sessionDataTask resume];