#pragma mark 发送请求
-(void)sendPostRequest{
NSURL *url=[NSURL URLWithString:baseURL];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval:5.0];//设置超时时间
[request setHTTPMethod:@"post"];
[request addValue:@"ios" forHTTPHeaderField:@"platform"];//设置一下请求头
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];//设置application/json,服务器才能获取参数
//==========================================================================
NSString *bodyString = [self createData];// 建立请求数据体
NSLog(@"发送数据:%@", bodyString);
NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];// 将生成的字符串转换成数据
NSInputStream *bodyInputStream=[NSInputStream inputStreamWithData:body];
[request setHTTPBodyStream:bodyInputStream];//把数据体设置给请求
//==========================================================================
//NSURLConnection替换为NSURLSession和NSURLSessionConfiguration
/**
三种工作模式:
默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。
瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。
后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。
*/
NSURLSessionConfiguration *configuration=[NSURLSessionConfiguration defaultSessionConfiguration];//用于配置会话的属性
[configuration setAllowsCellularAccess:YES];//设置允许使用蜂窝数据
[configuration setDiscretionary:YES];//YES时表示当程序在后台运作时由系统自己选择最佳的网络连接配置,该属性可以节省通过蜂窝连接的带宽
/**
获取NSURLSession类对象有几种方式:
第一种方式是使用静态的sharedSession方法,该类使用共享的会话,该会话使用全局的Cache,Cookie和证书。
第二种方式是通过sessionWithConfiguration:方法创建对象,也就是创建对应配置的会话,与NSURLSessionConfiguration合作使用。
第三种方式是通过sessionWithConfiguration:delegate:delegateQueue方法创建对象,二三两种方式可以创建一个新会话并定制其会话类型。
该方式中指定了session的委托和委托所处的队列。当不再需要连接时,可以调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。
这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。
*/
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[[NSOperationQueue alloc] init]];
/**
3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask
这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传和下载文件
*/
NSURLSessionDataTask *task= (NSURLSessionDataTask*)[urlSession dataTaskWithRequest:request];
[task resume];
}
//组合JSONObject
-(NSString*)createData{
NSError *error;
NSString *result;
NSMutableDictionary *rootdata=[[NSMutableDictionary alloc] init];
[rootdata setValue:@"login" forKey:@"type"];
[rootdata setValue:_phone forKey:@"userPhone"];
[rootdata setValue:_password forKey:@"passWord"];
NSData *jsonData =[NSJSONSerialization dataWithJSONObject:rootdata options:NSJSONWritingPrettyPrinted error:&error];
result =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
return result;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
if (textField==self.phoneText) {
[self.phoneText resignFirstResponder];
[self.passwordText becomeFirstResponder];
}else{
self.phone=self.phoneText.text;
self.password=self.passwordText.text;
NSLog(@"user phone is %@ and password is %@",self.phone,self.password);
[self.passwordText resignFirstResponder];
}
return YES;
}
#pragma mark 代理方法
//接收到服务器的响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler {
// 允许处理服务器的响应,才会继续接收服务器返回的数据
completionHandler(NSURLSessionResponseAllow);
NSLog(@"开始接受服务器的返回请求");
}
// 接收到服务器的数据(可能调用多次)
- (void)URLSession:(NSURLSession*)session dataTask:(NSURLSessionDataTask*)dataTask didReceiveData:(NSData *)data {
// 做接收数据的处理——拼接处理
if (_serverData == nil) {
_serverData = [NSMutableData data];
}
// 4. 追加数据
[_serverData appendData:data];
// 做接收数据的处理——拼接处理
NSLog(@"中间接收的数据:%@", data);
}
//请求成功或者失败(如果失败,error有值)
- (void)URLSession:(NSURLSession*)session task:(NSURLSessionTask*)task didCompleteWithError:(NSError *)error {
// 请求完成,成功或者失败的处理
NSLog(@"最终的数据是:%@", _serverData);
// 将数据编码成NTF8格式的字符串
NSString *string = [[NSString alloc]initWithData:_serverData encoding:NSUTF8StringEncoding];
NSLog(@"编码后的字符串是:%@", string);
// 释放原来接收的数据
_serverData = nil;
if (error) {
NSLog(@"errorCode:%ld",error.code);
}
}
@end