zoukankan      html  css  js  c++  java
  • 安全:GET请求(参数直接在网址中)是不安全的;POST请求(参数作为请求体单独提交)安全.

    /**

           安全: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

  • 相关阅读:
    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程
    002 01 Android 零基础入门 01 Java基础语法 01 Java初识 02 Java简介
    001 01 Android 零基础入门 01 Java基础语法 01 Java初识 01 导学
    001 Android Studio 首次编译执行项目过程中遇到的几个常见问题
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
    轻量级ORM框架——第二篇:Dapper中的一些复杂操作和inner join应该注意的坑
    轻量级ORM框架——第一篇:Dapper快速学习
    CF888G Xor-MST(异或生成树模板)
  • 原文地址:https://www.cnblogs.com/wukun168/p/6010807.html
Copyright © 2011-2022 走看看