OC笔记 - POST、GET请求、数据加密(2015.4.25)

来源:互联网 发布:officeword办公软件 编辑:程序博客网 时间:2024/05/17 05:56

1.GET & POST

GET和POST是两种最常用的与服务器进行交互的HTTP方法

 

GET

GET的语义是获取指定URL的资源

将数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用"?"连接,各变量之间使用"&"连接

貌似不安全,因为在传输过程中,数据被放在请求的URL中

传输的数据量小,这主要是因为受URL长度限制

 

POST

POST的语义是向指定URL的资源添加数据

将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向URL

所有数据对用户来说不可见

可以传输大量数据,上传文件只能使用Post

 

POST请求会向服务器发送数据体,因此在刷新页面时会出现提示窗口

而GET请求不会向服务器发送数据体,因此没有提示

从请求的本质而言,GET请求要比POST请求更安全,效率也会更高

 

利用Firebug可轻松查看Post请求的内容

 

2.iOS网络发送网络请求的步骤

(1)实例化URL(网络资源)

(2)根据URL建立URLRequest(网络请求)

默认为GET请求

对于POST请求,需要创建请求的数据体

(3)利用URLConnection发送网络请求(建立连接)

(4)获得结果

 

NSURLConnection提供了两个静态方法可以直接以同步或异步的方式向服务器发送网络请求

同步请求:

sendSynchronousRequest:returningResponse:error:

异步请求:

sendAsynchronousRequest:queue:completionHandler:

 

3.网络传输之二进制数据流

在网络请求过程中,接收数据的过程实际上是通过NSURLConnectionDataDelegate来实现的,常用代理方法包括:

服务器开始返回数据,准备工作(void)

connection:didReceiveResponse:

 

收到服务器返回的数据,本方法会被调用多次

- (void)connection:didReceiveData:

 

数据接收完毕,做数据的最后处理

(void)connectionDidFinishLoading:

 

网络连接错误

-(void)connection:didFailWithError:

 

4.数据加密——MD5

MessageDigest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321

 

MD5用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现

 

MD5的典型应用是对一段字节串产生指纹,以防止被“篡改”。例如,可以对一个readme.txt生成一个MD5的值并记录在案,如果其他人修改了文件中的任何内容,对该文件重新计算的MD5值会发生变化

 

MD5还广泛用于操作系统的登录认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面

 

MD5特性:

不可逆

同样的数据加密结果是一样的?密码上的一个忌讳

加点”盐”私钥

MD5解密网站:http://www.cmd5.com

 

5. NSURLConnection-GET请求实现登录

// 1.设置请求路径

    NSString *urlStr = [NSStringstringWithFormat:@"http://192.168.1.1:8080/MyServer/login?username=%@&pwd=%@", username, pwd];

   

    // 转码

   urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

   

    // URL里面不能包含中文

    NSURL *url = [NSURLURLWithString:urlStr];

   

    // 2.创建请求对象

    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url]; //默认就是GET请求

   request.timeoutInterval =5; // 设置请求超时

   

    // 3.发送请求

[selfsendAsync:request];

 

#pragma mark - NSURLConnectionDataDelegate代理方法

/**

 *  请求错误(失败)的时候调用(请求超时\断网\没有网,一般指客户端错误)

 */

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    NSLog(@"connection:didFailWithError:");

    NSLog(@"网络繁忙,请稍后再试");

}

 

/**

 *  当接受到服务器的响应(连通了服务器)就会调用

 */

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    NSLog(@"connection:didReceiveResponse:");

   

    // 初始化数据

    self.responseData = [NSMutableDatadata];

}

 

/**

 *  当接受到服务器的数据就会调用(可能会被调用多次,每次调用只会传递部分数据)

 */

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    NSLog(@"connection:didReceiveData:");

   

    // 拼接(收集)数据

    [self.responseDataappendData:data];

}

 

/**

 *  当服务器的数据接受完毕后就会调用

 */

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    NSLog(@"connectionDidFinishLoading:");

 

    // 解析服务器返回的数据

    NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:self.responseDataoptions:NSJSONReadingMutableLeaveserror:nil];

    NSString *error = dict[@"error"];

    if (error) {// 登录失败

       [MBProgressHUDshowError:error];

    } else {// 登录成功

       NSString *success = dict[@"success"];

       [MBProgressHUDshowSuccess:success];

    }

}

 

发送异步请求的其他方式

/**

 * 发送异步请求的方式1:类方法, block

 */

NSOperationQueue *queue = [NSOperationQueuemainQueue];

    [NSURLConnectionsendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response,NSData *data, NSError *connectionError) { // 当请求结束的时候调用 (拿到了服务器的数据,请求失败)

       

       //隐藏HUD (刷新UI界面,一定要放在主线程, 不能放在子线程)

       [MBProgressHUDhideHUD];

       

       /**

        解析data :

        {"error":"用户名不存在"}

        {"error":"密码不正确"}

        {"success":"登录成功"}

        */

       if (data) {// 请求成功

           NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

           NSString *error = dict[@"error"];

           if (error) {// 登录失败

                [MBProgressHUDshowError:error];

           } else { // 登录成功

                NSString *success = dict[@"success"];

                [MBProgressHUDshowSuccess:success];

           }

       } else { // 请求失败

           [MBProgressHUDshowError:@"网络繁忙,请稍后再试"];

       }

    }];

 

/**

 * 发送异步请求的方式2:start方法,代理

 */

    NSURLConnection *conn = [NSURLConnectionconnectionWithRequest:request delegate:self];

[conn start];// 异步执行

 

6. NSURLConnection-POST请求实现登录

    //发送请求给服务器(带上帐号和密码)

    // POST请求:请求体

   

    // 1.设置请求路径

    NSURL *url = [NSURLURLWithString:@"http://192.168.1.200:8080/MyServer/login"];

   

    // 2.创建请求对象

    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url]; //默认就是GET请求

   request.timeoutInterval =5; // 设置请求超时

   request.HTTPMethod =@"POST"; // 设置为POST请求

   

    // 通过请求头告诉服务器客户端的类型

   [request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];//客户端类型可随意更改

   

    // 设置请求体

    NSString *param = [NSStringstringWithFormat:@"username=%@&pwd=%@", username, pwd];

   request.HTTPBody = [paramdataUsingEncoding:NSUTF8StringEncoding];

   

    // 3.发送请求

    NSOperationQueue *queue = [NSOperationQueuemainQueue];

    [NSURLConnectionsendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response,NSData*data, NSError *connectionError) { // 当请求结束的时候调用 (拿到了服务器的数据,请求失败)

       //隐藏HUD (刷新UI界面,一定要放在主线程, 不能放在子线程)

       [MBProgressHUDhideHUD];

       

       /**

        解析data :

        {"error":"用户名不存在"}

        {"error":"密码不正确"}

        {"success":"登录成功"}

        */

       if (data) {// 请求成功

           NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];

           NSString *error = dict[@"error"];

           if (error) {// 登录失败

                [MBProgressHUDshowError:error];

           } else { // 登录成功

                NSString *success = dict[@"success"];

                [MBProgressHUDshowSuccess:success];

           }

       } else { // 请求失败

           [MBProgressHUDshowError:@"网络繁忙,请稍后再试"];

       }

    }];

 

7. MD5加密、加盐

pwd =[[pwd stringByAppendingString:@"abcdefg"] md5String]; // 进行MD5加密

 

加盐就是将数据拼接上一个固定的字符串后在进行加密

str = [str stringByAppendingString: @"abc"];

NSString *salt = [strmd5String];

 

比较安全的加密方法是将数据进行MD5加密后再按一定规则进行乱序(数据没有绝对的安全)

0 0
原创粉丝点击