【iOS】网络请求GET与POST
- 前沿
- 一. GET与POST的共同点
- 二. 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它使用起来就更加方便。