iOS开发之网络请求GET与POST

17人浏览 / 0人评论 / 添加收藏

前沿
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方法代码如下:
//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];
 

POST方法代码如下:

//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它使用起来就更加方便。
 

全部评论