iOS-同异步GET请求和POST请求

四种请求理解

  • 同步请求
    可以从网络上请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作。
    数据的请求过程在主线程执行的,网络数据传输的过程会导致主线程堵塞。

  • 异步请求
    不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行。
    数据的请求过程在多线程执行的,保持主线程的流畅性,UI界面的渲染与刷新在主线程中,主线程不流畅会导致UI界面卡顿。

  • GET请求
    get请求将参数直接写在访问路径上。操作简单,不过容易被外界看到,安全性不高,地址最多255字节;

  • POST请求
    post请求将参数放到body里面。POST请求操作相对复杂,需要将参数和地址分开,不过安全性高,参数放在body里面,不易被捕获。


get 请求

实现步骤

  1. 确定请求路径,GET请求参数直接跟在URL后面

  2. 创建请求对象(默认包含了请求头和请求方法 GET )

  3. 使用NSURLSession创建会话对象

  4. 根据会话对象创建请求任务(使用NSURLSessionDataTask)

  5. 执行Task

  6. 当得到服务器返回的响应后,再解析数据

代码示例

发送GET请求的第一种方法

-(void)getOne
{
    //对请求路径的说明
    //http://120.25.226.186:32812/login?username=520it&pwd=520&type=JSON
    //协议头+主机地址+接口名称+?+参数1&参数2&参数3
    //协议头(http://)+主机地址(120.25.226.186:32812)+接口名称(login)+?+参数1(username=520it)&参数2(pwd=520)&参数3(type=JSON)
    //GET请求,直接把请求参数跟在URL的后面以?隔开,多个参数之间以&符号拼接

    //1.确定请求路径
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];

    //2.创建请求对象
    //请求对象内部默认已经包含了请求头和请求方法(GET)
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    //3.获得会话对象
    NSURLSession *session = [NSURLSession sharedSession];

    //4.根据会话对象创建一个Task(发送请求)
    /*
     第一个参数:请求对象
     第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
               data:响应体信息(期望的数据)
               response:响应头信息,主要是对服务器端的描述
               error:错误信息,如果请求失败,则error有值
     */
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error == nil) {

            //6.解析服务器返回的数据
            //说明:(此处返回的数据是JSON格式的,因此使用NSJSONSerialization进行反序列化处理)
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"%@",dict);
        }
    }];

    //5.执行任务
    [dataTask resume];
}

发送GET请求的第二种方法

-(void)getTwo
{
//1.确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];

//2.获得会话对象
NSURLSession *session = [NSURLSession sharedSession];

//3.根据会话对象创建一个Task(发送请求)
/*
第一个参数:请求路径
第二个参数:completionHandler回调(请求完成成功或者失败 的回调)
         data:响应体信息(期望的数据)
         response:响应头信息,主要是对服务器端的描述
         error:错误信息,如果请求失败,则error有值
注意:
  1)该方法内部会自动将请求路径包装成一个请求对象,该请求对象默认包含了请求头信息和请求方法(GET)
  2)如果要发送的是POST请求,则不能使用该方法
\*/
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

  //5.解析数据
  NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
  NSLog(@"%@",dict);
}];

//4.执行任务
[dataTask resume];
}

post 数据传输

实现步骤

  1. 确定请求路径

  2. 创建可变的请求对象

  3. 修改请求方法为POST

  4. 设置请求体,把参数转换为二进制数据,然后设置请求体

  5. 创建会话对象(NSURLSession)

  6. 根据会话对象创建请求任务(NSURLSessionDataTask)

  7. 执行Task

  8. 当得到服务器返回的响应后,然后解析数据

 -(void)post
{
    //对请求路径的说明
    //http://120.25.226.186:32812/login
    //协议头+主机地址+接口名称
    //协议头(http://)+主机地址+接口名称
    //POST请求需要修改请求方法为POST,并把参数转换为二进制数据 再设置为请求体
    
    //1.创建会话对象
    NSURLSession *session = [NSURLSession sharedSession];
    
    //2.根据会话对象创建task
    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
    
    //3.创建可变的请求对象
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //4.修改请求方法为POST
    request.HTTPMethod = @"POST";
    
    //5.设置请求体
    request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
    
    //6.根据会话对象创建一个Task(发送请求)
    /*
     第一个参数:请求对象
     第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
                data:响应体信息(期望的数据)
                response:响应头信息,主要是对服务器端的描述
                error:错误信息,如果请求失败,则error有值
     */
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        //8.解析数据
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
        NSLog(@"%@",dict);
        
    }];
    
    //7.执行任务
    [dataTask resume];
}
 

数据传输方式get和post的区别

从表面的意思看get 和 post的区别get就是获取数据,post就是发送数据。这个是误区。其实两者都可以的,在iOS向服务器发送请求里面可以带参数。
一般在浏览器中输入网址访问资源都是通过GET方式;可以通过Method指定提交方式为GET或者POST,默认为GET提交 。

两种请求方式的区别:

  1. GET会把要传的信息拼接到url中。而POST将数据放在BODY中。
  2. GET的URL会有长度上的限制,则POST的数据则可以非常大。
  3. POST的安全性要比GET的安全性高。

POST参数是以一个字符串方式传递: "name=huacaocoder&password=123”

[request setHTTPMethod:@"POST"]; 知道请求方法为POST方法,但是要注意POST必须大写。

[request setHTTPBody:postData];将要提交的数据放到请求体中。


此文主要是参考网上资料整理出来,仅供学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,538评论 11 349
  • iOS的网络编程主要涉及两者:客户端和服务器端,上传和下载数据都是客户端通过访问服务器端来实现的。 服务器端开发语...
    somepark阅读 5,310评论 0 2
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,057评论 6 13
  • 23 惊鸿一瞥 第二日/中午时分 一阵鼻间的瘙痒让秋雨翻了个身,捉住了一只纤弱的手。他睁开一双迷蒙的眼,恍若看到宛...
    CECILLA寒阅读 2,662评论 0 0
  • 快乐不在于事情,而在于我们自己。——理查德·瓦格纳 我也曾是一名留守儿童,父母从小外出打工,我和乡下的爷爷奶奶生活...
    俊贰阅读 2,515评论 0 2

友情链接更多精彩内容