/**
安全:GET請求(參數直接在網址中)是不安全的;POST請求(參數作為請求體單獨提交)安全.
*/
/**
同步連接和異步連接的區別:
同步連接:網絡請求任務交由主線程完成,當主線程請求數據時,所有的用戶交互都無法處理,影響用戶體驗.
異步連接:網絡請求任務交由子線程去完成,當子線程請求數據時,主線程依然可以處理用戶交互.用戶體驗好.
*/
GET:
//同步請求
- (IBAction)handleSychronize:(id)sender {
//網址字符串.
NSString *urlSrtr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//網址字符串中若含漢字,特殊符號等,需要進行編碼轉化.
//ios9之前采用的編碼轉換方法
// [urlSrtr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
urlSrtr = [urlSrtr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
//1.創建NSURL網址對象
NSURL *url = [NSURL URLWithString:urlSrtr];
//2.創建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.連接服務器
NSURLResponse *respondse = nil;//服務器的響應對象.
NSError *error = nil;//存儲鏈接失敗的錯誤信息.
/**
* 同步請求:相當於把耗時的網絡請求放到同一個線程(每一個程序至少有一個線程,平時寫的代碼都是主線程下執行的)中處理,當數據過大時,會產生界面卡頓.
*/
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&respondse error:&error];
//data就是我們通過網址從服務器請求到的數據.
}
//異步請求
- (IBAction)handleAsychronize:(id)sender {
//網址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//創建NSURL網址對象
NSURL *url = [NSURL URLWithString:urlStr];
//創建請求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//連接服務器
//參數2:[NSOperationQueue mainQueue] 獲取主線程隊列. 所給的線程決定block內部代碼執行是在哪個線程下(UI界面上的刷新,用戶交互,必須放在主線程執行.若在子線程中執行,可能會出現未知問題);
//異步請求的第一種方式: block形式.
/*
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//請求完成后才會回調, 返回對應的數據Data.
//response 服務器響應對象
//data 服務器返回的數據
//connectionError 連接的錯誤信息
//解析數據
NSLog(@"%@",data);
}];
*/
//異步請求第二種方式:delegate形式
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark - NSURLConnectionDataDelegate -
//收到服務器響應的時候
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//該方法是在建立連接過程中觸發的,只會執行一次.
//再次創建NSMutableData對象 用於拼接返回的數據
self.mutData = [NSMutableData data];
//response服務器響應對象
NSLog(@"%lld",response.expectedContentLength);
}
//接收到數據時
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[self.mutData appendData:data];
}
//數據傳輸結束時
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
//解析數據
NSLog(@"%@",self.mutData);
}
//連接失敗時
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"%@",error);
}
POST:
//同步請求
- (IBAction)handleSychrnize:(id)sender {
//1.網址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//2.若存在漢字或特殊符號 需編碼轉化
//3.創建網址對象
NSURL *url = [NSURL URLWithString:urlStr];
//4.創建請求(可變請求對象)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//5.創建參數字符串
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
//6.參數字符串轉為NSData
NSData *body = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
//7.設置請求體
[request setHTTPBody:body];
//8.設置請求方式:(默認請求方式是GET);
[request setHTTPMethod:@"POST"];
//requestHeader
NSDictionary *headers = [NSDictionary dictionaryWithObject:@"Bearer YWMtP_8IisA-EeK-a5cNq4Jt3QAAAT7fI10IbPuKdRxUTjA9CNiZMnQIgk0LEUE${token}" forKey:@"Authorization"];
[request setAllHTTPHeaderFields:headers];
//連接服務器,發送請求
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"%@",data);
}
//異步請求
- (IBAction)handleAsychrnize:(id)sender {
//1.創建網址字符串
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
//2.創建網址對象
NSURL *url = [NSURL URLWithString:urlStr];
//3.創建請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//4.設置請求體
//參數字符串
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *body =[parmStr dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:body];
//5.設置請求方式
[request setHTTPMethod:@"POST"];
//異步連接
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue]completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _NullableconnectionError) {
NSLog(@"%@",data);
}];
}
session:
//
// SessionViewController.m
// UISenior-DataRequest
//
// Created by Eric on 16/4/11.
// Copyright © 2016年 Eric. All rights reserved.
//
#import "SessionViewController.h"
@interface SessionViewController ()<NSURLSessionDataDelegate>
{
long long allBytes;//存儲數據總長度;
}
@property(nonatomic,strong)NSMutableData *mData;
@end
@implementation SessionViewController
/**
NSURLConnection在ios9.0之后被棄用;
替代 使用NSURLSession
主要提供三種功能:1.數據請求:NSURLSessionDataTask
2.下載 :NSURLSessionDownloadTask
3.上傳 : NSURLSessionUploadTask
*/
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//獲取數據
// [self loadDataFromServer];
//GET請求
// [self getData];
//POST請求
// [self postAction];
//獲取數據
// [self configureSession];
//獲取數據 使用delegate形式
[self delegateAction];
}
//使用session代理的方式 請求數據
-(void)delegateAction{
//1.URL
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURLURLWithString:@"http://img.zcool.cn/community/0332de1559f800a32f875370ac09559.jpg"]];
//使用代理形式請求數據:不能使用全局的對話對象
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
//創建session 創建的同時設置代理對象.
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//發起任務
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
//開啟任務.
[dataTask resume];
}
#pragma mark -NSURLSessionDelegate -
//服務器收到響應時
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
//允許響應 繼續接受數據 (如果不寫執行到此就結束)
completionHandler(NSURLSessionResponseAllow);
//創建mData
self.mData = [NSMutableData data];
allBytes = response.expectedContentLength;
}
//接收數據時
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData*)data{
//每次返回一部分數據 需要拼接
[self.mData appendData:data];
//獲取當前獲取數據的百分比
double scale = self.mData.length*1.0 /allBytes;
self.scaleLable.text = [NSString stringWithFormat:@"%.2f%%",scale*100];
self.image.image = [UIImage imageWithData:self.mData];
// NSLog(@"%lf",scale);
}
//接收數據完成時
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError*)error{
if (!error) {
NSLog(@"%@",self.mData);
}
}
//使用自己創建的Session發起任務.
//一般項目中,建議程序中少創建session,減少底層建立連接的過程.
- (void)configureSession{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"]];
//創建對話配置對象(對會話進行設置)
/**
* 支持三種類型:default默認的;
臨時會話
后台
*/
NSURLSessionConfiguration *configure = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configure];
//使用自己創建的會話創建任務.
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullabledata, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",data);
}];
[task resume];
}
//POST請求
-(void)postAction{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx"];
//創建請求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//設置請求方式
[request setHTTPMethod:@"POST"];
//設置請求體
NSString *parmStr =@"date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213";
NSData *body = [parmStr dataUsingEncoding:NSUTF8StringEncoding];
request.HTTPBody =body;
//創建會話對象
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *_Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",data);
}];
//手動開啟任務.
[dataTask resume];
}
//GET請求
-(void)getData{
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20151101&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
NSURLRequest *request = [NSURLRequest requestWithURL:urlcachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:-1];
//3. NSURLSession對象
NSURLSession *session = [NSURLSession sharedSession];//獲取系統為我們提供的全局繪畫.
//4.創建數據請求任務
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",str);
}];
[task resume];
}
-(void)loadDataFromServer{
//網址字符串
NSString *str = @"http://img.zcool.cn/community/0332de1559f800a32f875370ac09559.jpg";
//創建NSURL對象
NSURL *url = [NSURL URLWithString:str];
//創建請求
/*參數①:網址對象
參數②:緩存策略
參數③: 超時時間 給-1代表不設置超時時間.
*/
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
//使用session請求數據
//創建一個NSURLSession對象(網絡繪畫對象)
NSURLSession *session = [NSURLSession sharedSession];
//請求數據 創建 NSURLSessionDataTask
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullabledata, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//data就是從服務器獲取的數據.
//response服務器響應對象
//error 連接錯誤信息.
// NSLog(@"%@",data);
//1.界面上的處理需要回到主線程,執行界面刷新任務
// [self performSelectorOnMainThread:@selector(refreshUI:) withObject:data waitUntilDone:YES];
//2.GCD方式 回到主線程
dispatch_async(dispatch_get_main_queue() , ^{
self.image.image =[UIImage imageWithData:data];
});
}];
//手動開始執行任務
[dataTask resume];
}
//刷新界面操作
- (void)refreshUI:(NSData *)data{
self.image.image = [UIImage imageWithData:data];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end