一、http与https协议
URL全称是uniform Resource Locator(统一资源定位符)。
基本格式为:协议://主机地址/路径
https协议比http协议多了一个加密步骤。
关于网络请求的返回错误,常见的一些网络错误:
404:服务器找不到指定的资源,请求的页面不存在(例如,浏览器请求的网页已被删除或转移,但不排除链接有效的可能性); 410:所请求的页面不存在(注:410代表一个永久的,暂时的,404); 200:服务器成功返回请求的页面; 301永久重定向的URL 302:你用的是360浏览器一般而言,浏览器只支持http请求里的GET请求。
二、http请求方式(iOS中)
常见的请求有GET请求和POST请求。
不同点:
1.给服务器传输数据的方式不同:
GET:通过网址字符串
POST:通过data
2.传输数据的大小
GET:网址字符串最多255字节(目前可以达到1kb)
POST:使用NSData
3.安全性
GET:所有传输给服务器的数据,显示在网址里,类似于密码的明文输入,直接可见。
POST:数据被转化为NSData(二进制数据),类似于密码的密文输入。
三、编程实现网络请求
首先,在Xcode的info.plist文件里需要修改信息,使其支持http请求。
上demo:
//get的同步请求
-(void)getAndSychronous{
//第一步,得到服务器地址(统一资源定位符)
NSString *URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//网址
NSURL *url = [NSURL URLWithString:URLStr];
//创建网络请求
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
//创建同步链接
NSError* error;
//在这里运用的是废弃的方法
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:&error];
//解析传回的json数据
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//get异步请求
-(void)getAndAsychronous{
//第一步,得到服务器地址(统一资源定位符)
NSString *URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
//网址
NSURL *url = [NSURL URLWithString:URLStr];
//创建网络请求
NSURLRequest *req = [[NSURLRequest alloc]initWithURL:url];
//异步请求block
[NSURLConnection sendAsynchronousRequest:req queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&connectionError];
NSLog(@"%@",dic);
}];
NSLog(@"异步请求---------*");
}
//Post同步请求
-(void)postAndsychronous{
//post请求,一般只需要,协议:主机地址:路径
NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//创建路径
NSURL* url = [NSURL URLWithString:URLStr];
//设置请求方式
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//不设置的时候默认为get请求
[mReq setHTTPMethod:@"POST"];
//设置参数
NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//为请求设置参数
[mReq setHTTPBody:pData];
//建立同步链接
NSData *data = [NSURLConnection sendSynchronousRequest:mReq returningResponse:nil error:nil];
NSDictionary* dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//post异步 协议代理
-(void)postAndAsychronous{
//建立路径
NSString* pStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
NSURL *url = [NSURL URLWithString:pStr];
//初始化请求
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//设置请求参数
NSString* str =@"date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[mReq setHTTPMethod:@"POST"];
[mReq setHTTPBody:data];
//开始异步请求
NSURLConnection *connection = [NSURLConnection connectionWithRequest:mReq delegate:self];
}
#pragma mark <NSURLConnectionDelegate,NSURLConnectionDataDelegate>
//开始响应
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"开始响应,可以初始化容器");
//将要开始返回数据
self.mData = [[NSMutableData alloc]init];
}
//接受数据,data只是数据片段,需要我们进行拼接
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"开始接受数据片段");
[self.mData appendData:data];
}
//链接完成
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"本次链接完成");
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.mData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",dic);
}
//链接出错的代理方法
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"error-----%@",error);
}
//session的get请求
- (void)sessionGet{
//获取全局对象
NSURLSession* session = [NSURLSession sharedSession];
/*//设置工作模式的方法
NSURLSessionConfiguration* confi = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *sessionSet = [NSURLSession sessionWithConfiguration:confi];*/
//创建URL对象
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151031&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//不需要设置请求超时打开
/*//建立请求任务
NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
NSLog(@"在block里解析的数据------%@",dic);
}];
//启动请求任务
[task resume];*/
//需要设置请求超时,第二个参数为缓存策略
NSURLRequest* req = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
//建立任务
NSURLSessionTask* task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString* str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str==%@",str);
}];
[task resume];
}
//session的post请求
-(void)sessionPost{
//设置网址
//post请求,一般只需要,协议:主机地址:路径
NSString* URLStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//创建路径
NSURL* url = [NSURL URLWithString:URLStr];
//设置请求对象,只要设置请求方式,就必须是可变的请求对象
NSMutableURLRequest* req = [[NSMutableURLRequest alloc]initWithURL:url];
//设置请求方式,不设置的话,默认为GET方式
[req setHTTPMethod:@"POST"];
//设置参数
NSString* pStr = @"date=20151031&startRecord=1&len=1&udid=1234567890&terminalType=Iphone&cid=213";
NSData* pData = [pStr dataUsingEncoding:NSUTF8StringEncoding];
//为请求设置参数,注意参数类型,需要的是NSData类型
[req setHTTPBody:pData];
//得到全局的session对象
NSURLSession *session = [NSURLSession sharedSession];
//设置加载任务的对象
NSURLSessionDataTask* task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString* str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}];
//任务开始
[task resume];
}
//session的post代理请求
-(void)sessionPostDelegate{
//设置网址
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//建立请求对象
NSMutableURLRequest* mReq = [[NSMutableURLRequest alloc]initWithURL:url];
//设置请求对象的请求超时
[mReq setTimeoutInterval:30];
//设置请求对象的请求方法
[mReq setHTTPMethod:@"POST"];
//设置请求对象的请求参数
NSString* str = @"date=20151031&startRecord=1&len=10&udid=1234567890&terminalType=Iphone&cid=213";
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
[mReq setHTTPBody:data];
//建立全局对象,用以创建请求任务
NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
NSURLSessionTask* task = [session dataTaskWithRequest:mReq];
[task resume];
}
#pragma mark <NSURLSessionDataDelegate>
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
NSLog(@"服务器开始响应,准备返回数据");
//允许处理服务器对象,才会进行下一步操作
completionHandler(NSURLSessionResponseAllow);
//当网络请求为http时,response的实质是NSHTTPURLResponse类型
NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
//创建可变的data,准备接收请求的字符片段。
self.mData = [NSMutableData data];
}
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
NSLog(@"服务器开始返回数据");
//开始接收每次收到的data数据
[self.mData appendData:data];
}
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
NSLog(@"数据接收完成,网络请求成功");
//转化接收回来的数据
if (!error) {
NSString *str = [[NSString alloc]initWithData:self.mData encoding:NSUTF8StringEncoding];
NSLog(@"我是请求回来的数据%@",str);
}else{
NSLog(@"%@",error);
}
}