NSURLSession访问网络数据
1.NSMutableURLRequest的设置
//创建NSMutableURLRequest对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求类型
[request setHTTPMethod:@"POST"];
//设置超时时间
[request setTimeoutInterval:];
//设置缓存策略
[request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
//设置Base64认证
NSString *authString = [[[NSString stringWithFormat:@"%@:%@",kGlobal.userInfo.sAccount,kGlobal.userInfo.sPassword] dataUsingEncoding:NSUTF8StringEncoding] base64EncodedStringWithOptions:];
authString = [NSString stringWithFormat: @"Basic %@", authString];
[request setValue:authString forHTTPHeaderField:@"Authorization"];
//设置POST方法需要传递的参数
NSString *paramStr = [NSString stringWithFormat:@"PostID=%@&Name=%@&Text=%@",self.uuID,kGlobal.userInfo.sApplyName,self.textView.text];
NSData *bodyData = [paramStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:bodyData];
2.创建网络会话
//创建网络会话
NSURLSession *session = [NSURLSession sharedSession];
3.创建网络请求(本文介绍 NSURLSessionDataTask 和 NSURLSessionUploadTask 两种)
//方案一:使用NSURLSessionDataTask请求网络数据
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error == nil) {
NSLog(@"文字发布成功!");
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;//将response对象强制转换为NSHTTPURLResponse,可以获取HTTP响应报文的头信息,如响应代码200表示请求成功可以用(httpResponse.statusCode获取)
NSLog(@"返回的Response:%@",httpResponse);
NSError *error = nil;
//而真正的HTTP响应的Body内容则需要序列化获取
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];//返回一个字典类型数据
//NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];//返回一个JSON数组
//NSArray *array = [NSJSONSerialization JSONObjectWithData:[[dic valueForKey:@"Pictures"] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:&error];//[dic valueForKey:@"Pictures"]得到的是第一次解析得到的JSON Array的字符串,需要二次解析成JSON的数组
if (!error) {
NSLog(@"返回信息:%@",dic);
}
}else{
NSLog(@"发布失败,代码%@",error);
}
}];
4.发送网络请求
[task resume];
//方案二:使用NSURLSessionUploadTask请求网络数据,NSURLSessionUploadTask 和 NSURLSessionDataTask的不同之处在于NSURLSessionUploadTask更像Web的表单提交,例如模拟Web表单的图片上传可以使用NSURLSessionUploadTask。
NSURLSessionUploadTask *dataTask = [session uploadTaskWithRequest:request fromData:bodyData completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {if (error == nil) {
NSLog(@"发布成功!");
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"statusCode:%lu",httpResponse.statusCode);
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
if (picNum == self.imgsArray.count) {
[SVProgressHUD showSuccessWithStatus:kTXT(@"IMUploadSuccess")];
[self dismissViewControllerAnimated:YES completion:nil];
}
}else{
NSLog(@"发布失败,代码%@!",error);
}
}];
上面发送网络请求的方法和方法一的不同之处在于bodyData的构建,方法二的bodyData是模拟HTTP的报文结构来的,使用NSData来拼接HTTP报文。
//bodyData的构建方法
- (NSData *)getBodydataWithImage:(UIImage *)image
{
//把文件转换为NSData
NSData *fileData = UIImageJPEGRepresentation(image, 1.0); NSString *fileName=[Global getUniqueStrByUUID]; //1.构造body string
NSMutableString *bodyString = [[NSMutableString alloc] init]; //2.拼接body string
//(1)file_name
[bodyString appendFormat:@"--%@\r\n",boundry];
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"FileName\"\r\n"];
[bodyString appendFormat:@"Content-Type: text/plain; charset=\"utf-\"\r\n\r\n"];
[bodyString appendFormat:@"aaa%@.jpg\r\n",fileName]; //(2)PostID
[bodyString appendFormat:@"--%@\r\n",boundry];
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"PostID\"\r\n"];
[bodyString appendFormat:@"Content-Type: text/plain; charset=\"utf-\"\r\n\r\n"];
[bodyString appendFormat:@"%@\r\n",self.uuID]; //(3)pic
[bodyString appendFormat:@"--%@\r\n",boundry];
[bodyString appendFormat:@"Content-Disposition: form-data; name=\"pic\"; filename=\"%@.jpg\"\r\n",fileName];
[bodyString appendFormat:@"Content-Type: image/jpeg\r\n\r\n"];
//[bodyString appendFormat:@"Content-Type: application/octet-stream\r\n\r\n"]; //3.string --> data
NSMutableData *bodyData = [NSMutableData data];
//拼接的过程
//前面的bodyString, 其他参数
[bodyData appendData:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
//图片数据
[bodyData appendData:fileData]; //4.结束的分隔线
NSString *endStr = [NSString stringWithFormat:@"\r\n--%@--\r\n",boundry];
//拼接到bodyData最后面
[bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]]; return bodyData;
}
整个bodyData的构建过程原理根据HTTP报文上传图片时,格式用boundory进行分割,但是每次HTTP报文的boundory的值是不一样的,这里为了方便就定义一个固定值,其实固定值也是可以上传成功,亲测有效。HTTP的body体里面把文字和图片内容用boundory和换行符进行分割,分区发送,邮件内容也是类似,所以只要遵循HTTP报文的格式,就可以模拟HTTP报文上传图片。
//boundry的设置
static NSString *boundry = @"----------V2ymHFg03ehbqgZCaKO6jy";//设置边界
//[Global getUniqueStrByUUID]是工具类的方法,用于产生一个GUID,具体的方法明细如下:
+ (NSString *)getUniqueStrByUUID
{
CFUUIDRef uuidObj = CFUUIDCreate(nil);//create a new UUID //get the string representation of the UUID NSString *uuidString = (__bridge_transfer NSString *)CFUUIDCreateString(nil, uuidObj); CFRelease(uuidObj); return uuidString ;
}
NSURLSession访问网络数据的更多相关文章
- 使用NSURLSession获取网络数据和下载文件
使用NSURLSession获取网络数据 使用NSURLSession下载文件
- SWIFT中使用AFNetwroking访问网络数据
AFNetworking 是 iOS 一个使用很方便的第三方网络开发框架,它可以很轻松的从一个URL地址内获取JSON数据. 在使用它时我用到包管理器Cocoapods 不懂的请移步: Cocoapo ...
- Android访问网络数据的几种方式Demo
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面介绍四种常用网络请求方式,我这边是通过Android单元测试来完成这四种方法的,还不清楚Android的单元测试的同学们请看 ...
- 利用Handler访问网络数据
废话不多白吃,代码如下: 1.MainActivity package com.yz.day11_22_handler;import android.app.Activity;import andro ...
- 使用python访问网络上的数据
这两天看完了Course上面的: 使用 Python 访问网络数据 https://www.coursera.org/learn/python-network-data/ 写了一些作业,完成了一些作业 ...
- iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件
NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的 ...
- iOS - NetRequest 网络数据请求
1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...
- ios开发之网络数据的下载与上传
要实现网络数据的下载与上传,主要有三种方式 > NSURLConnection 针对少量数据,使用“GET”或“POST”方法从服务器获取数据,使用“POST”方法向服务器传输数据; > ...
- android 使用httpclient访问网络
在主活动类中,调用一个线程访问网络(android4.0以上耗时的操作不能放在主线程中): //声明两个Button对象,与一个TextView对象private TextView mTe ...
随机推荐
- 如何查看OpenCv的源代码
需要移植部分opencv的算法,不得不查看opencv的原始代码. 在一般的代码调试中一般只能看到一些opencv的函数声明和定义,看不到内部执行过程,需要利用 CMake导出opencv 源码,生成 ...
- cve-2015-5199漏洞分析
继续之前hackteam的flash漏洞,这次的对象为cve-2015-5199,遂做一下记录. 首先,在该exp中TryExpl函数为漏洞的触发函数,该函数也为本次调试的主要对象,函数的开始首先创建 ...
- html学习第一天笔记——第四、五章节
讲解:1. 在上面的例子中,“庄生晓梦迷蝴蝶.望帝春心托杜鹃.” 这是一句诗歌,出自晚唐诗人李商隐的<锦瑟> .因为不是作者自己的文字,所以需要使用<q></q>实 ...
- Android 自动化测试—robotium(十一) robotium实现微博绑定
利用robotium实现微博的自动绑定 android应用进行微博绑定主要有两种方式,一种客户端实现个webView,请求微博默认的授权页,另一种则是直接调用微博客户端,这里实现的为前一种,即进和微博 ...
- Linux 计划任务
实例: 每5分钟定时访问一个url # crontab -e #*/5 * * * * /usr/bin/curl http://aa.com:8080/tools/sitemap.php >& ...
- 数论 - Pairs(数字对)
In the secret book of ACM, it’s said: “Glory for those who write short ICPC problems. May they live ...
- PHP操作字符串 截取指定长度字符 移除字符串两侧 左侧 右侧指定字符 或空白字符 替换字符
trim() trim() 函数移除字符串两侧的空白字符或其他预定义字符. <?php $str = "Hello World!"; echo $str . "&l ...
- http状态码详解
1 网址协议不支持的协议. 2 检测器内部错误. 3 网址格式不正确. 5 无法连接到代理服务器. 6 无法连接到服务器或找不到域名. 7 连接服务器失败. 28 操作超时.可能原因:页面执行时间过长 ...
- 06@LabVIEW发布功能总结
前言 在没有接触到LabVIEW强大的发布功能前,我时常发愁如何把自己的工具包给别人装上,有时候为了一些特定的安装,需要自己写一个一键安装的程序,时间长了发现还不如直接复制来的快,就是苦了那些用工具包 ...
- linux软件包管理(上)
1.二进制包管理(RPM,yum) 2.源代码包的安装 3.脚本安装(shell或java) 4.Debian系列的linux软件包管理简介 在下载rmp包的时候注意检查硬件平台是否正确,如果硬件平台 ...