【iOS】网络请求GET与POST

前沿

HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查 ,改 ,增 ,删 4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息,个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异 。

一. GET与POST的共同点

  • 都是常见的HTTP请求方法,用于与服务器进行通信。都是常见的HTTP请求方法,用于与服务器进行通信。
  • 都可以传输数据和与服务器进行交互。
  • 都可以在请求头中设置自定义的HTTP头字段。
  • 都可以使用SSL/TLS进行安全传输。

二. GET与POST的不同点

  • 数据传输方式:
    GET方法:使用GET方法时,请求参数会附加在URL的查询字符串中,以键值对的形式发送给服务器。
    POST方法:使用POST方法时,请求参数会包含在请求体中。
  • 安全性:
    GET方法:由于GET请求的参数暴露在URL中,可能被浏览器历史记录、代理服务器等记录和获取,因此不适合传输敏感信息。
    POST方法:POST请求的参数包含在请求体中,相对于GET请求更安全,适合传输敏感信息。
  • 数据长度限制:
    GET方法:由于GET请求的参数附加在URL中,URL的长度有限制,不同浏览器和服务器对URL长度的限制也不同。
    POST方法:POST请求的参数包含在请求体中,没有像URL一样的长度限制,但服务器端也可能对请求体的大小进行限制。

三. 实现方式

首先来看一下get方法的使用,
GET方法

- (void) Getofinformation {
    
    //1.创建URL对象
    NSURL* url = [NSURL URLWithString:@"https://news-at.zhihu.com/api/4/news/before/20231124"];
    //2.创建回话 session支持三种类型的任务
    //  NSURLSessionDataTask //加载数据
    //  NSURLSessionDataDownloadTask  //下载
    //  NSURLSessionDataUploadTask  //上传
    NSURLSession* session = [NSURLSession sharedSession];
    //3.创建请求任务 (该方法内部默认使用的是get方法)直接进行url的传递
    NSURLSessionTask* datetask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
            NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"请求成功");
            NSLog(@"%@", json[@"date"]);
            for (int i = 0; i < 5; i++) {
                NSLog(@"%@", json[@"stories"][i][@"title"]);
            }
        } else {
            NSLog(@"请求失败");
        }
    }];
    //4.开始任务
    [datetask resume];
    
}

上面是以知乎日报的API为例,展示一下get方法的运行的结果。
在这里插入图片描述
POST方法

- (void) Postoinformation {
    //post
    //1.创建URL对象
    NSURL* url = [NSURL URLWithString:@"https://news-at.zhihu.com/api/4/news/before/20231124"];
    //2.创建请求对象
    //第一个参数是你的URL
    //第二个参数是请求的缓存策略
    //第三个参数是设置请求超时时间
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    //3.设置请求方法为post
    [request setHTTPMethod:@"POST"];
    //4.设置请求头信息
    //key(头字段名(不区分大小写)):Content-Type,
    //Value(头字段值)为下面三种:(还是得根据后台给的来设置)
    //application/x-www-form-urlencoded(后台接收为分开的参数时,如?name=liyu&password=123)
    //application/json(后台接收为json对象时)
    //multipart/form-data(上传文件时)
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    //5.设置请求体
    NSString* param = [NSString stringWithFormat:@"uesrname=%@&pwd=%@", self.nameString, self.password];
    //把拼接后的字符串转换为data,设置请求体(这个data就是请求体)
    request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
    //6.建立会话 session支持三种类型的任务
   //    NSURLSessionDataTask  //加载数据
   //    NSURLSessionDownloadTask  //下载
   //    NSURLSessionUploadTask   //上传
    NSURLSession* session =[NSURLSession sharedSession];
    //7.创建请求任务
    NSURLSessionDataTask* dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (!error) {
            NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"请求成功");
            NSLog(@"%@", json[@"date"]);
            for (int i = 0; i < 5; i++) {
                NSLog(@"%@", json[@"stories"][i][@"title"]);
            }
        } else {
            NSLog(@"请求失败");
        }
    }];
    //8.启动任务
    [dataTask resume];
}

正如上面的代码中网络请求的默认方法为GET,如果要使用其他方法需要设置 [request setHTTPMethod:@“POST”],然后将拼接好的参数作为请求体附加到HTTP请求中,以便在发送POST请求时将数据传输到服务器端。

总结

从上边两个不难看出两个的区别,无非就是post多了一个请求体,其他的也没什么区别,但是post的好处还有很多,首先它的保密性和安全性就比较高,所以以后我们还是尽量多使用post请求数据的好,另外上述说的仅仅只是使用系统自带方法的代码,当然你也可以使用第三方库,比如AFNetworking它使用起来就更加方便。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值