前沿
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它使用起来就更加方便。
全部评论