GET请求和POST请求剖析

本文对比分析了HTTP协议中GET与POST两种请求方法的特点及应用场景,包括数据传递方式、安全性考量及缓存机制等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTTP/1.1协议中,定义了8种发送http请求的方法

GETPOSTOPTIONSHEADPUTDELETETRACECONNECTPATCH

根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式

PUT :增

DELETE :删

POST:改

GET:查

最常用的是GETPOST(实际上GETPOST都能办到增删改查)

要想使用GETPOST请求跟服务器进行交互,得先了解一个概念

参数

就是传递给服务器的具体数据,比如登录时的帐号、密码

缓存是针对URL而言的。

GETPost的比较如下:

GET的本质是

从服务器拿数据,效率更高。

从数学的角度讲,GET的结果是“幂等”的

GET请求能够被缓存

在HTTP协议中,没有对GET请求的数据大小限制,不过因为浏览器的不同,一般限制在 2~8k之间

所有的参数包装在URL中,并且服务器的访问日志会记录,不要传递密码账户的敏感信息。

参数格式:?在资源路径末尾添加?表示追加参数。

变量名=变量值 每一个变量及值按照”变量名=变量值”方式设定,不能包含空格或者中文字符

& 多个参数使用&连接。


POST

POST的本质是给。

向服务器发送数据,也可以获得服务器处理之后的结果,效率不如GET。

POST请求不能被缓存

POST提交数据比较大,大小靠服务器的设定值限制,PHP通常设定2M。

URL中只有资源路径,但不包含参数,服务器日志不会记录参数,相对更安全。

参数被包装成二进制数据体,格式与GET基本一致,只是不包含 ?

所有涉及用户隐私的数据(密码,银行卡账号)一定要使用POST方式传递。


URL GET方法 在网络访问的URL中不能包含空格以及中文等特殊符号。


新建工程,代码如下:

<span style="font-size:18px;">//
//  ViewController.m
//  05-用户登录
//
//  Created by apple on 15/1/20.
//  Copyright (c) 2015年 apple. All rights reserved.
/**
 GET和POST比较
 - url 
 GET:
     http://127.0.0.1/login.php?username=%@&password=%@
     1. http://127.0.0.1主机地址
     2. login.php是服务器负责登录的脚本(php,java)
     3. ? 后面的就是参数,是给服务器传递的参数
     参数的格式
     变量名=值
     username=@"zhangsan"
     4. & 如果是多个参数,通过这个进行连接。
    注意点: url不能包含中文或者空格及特殊符号, 如果有需要转义
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 
 POST: 
    只是一个单纯的资源路径(没有任何参数,因为参数都在数据体里)
 
 - request
    GET - 什么都不需要指定,因为默认的HTTPMethod 就是“GET”
    POST - 
        1. 需要指定HTTPMethod 是POST
        2. 指定了数据体的二进制.
        POST出现中文,也不需要转义,(系统帮我们实现了)
    *** POST的参数和GET在URL里的参数,格式是一样的。 只是没有 ?
 
 
 - Connection
    都一样
 
 */

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  
    [self postLogin];
    
}
/**POST*/
- (void)postLogin
{
    
    // 1. url
    NSString *urlString = @"http://127.0.0.1/login.php";
    
    NSURL *url = [NSURL URLWithString:urlString];
    
    // 2. 可变的请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f];
    
    // 2.1 指定http的访问方法,服务器短才知道如何访问
    request.HTTPMethod = @"POST";
    
    // 2.2 指定数据体,数据体的内容可以从firebug里面直接拷贝
    // username=zhangsan&password=zhang
    NSString *username = @"张三";
    NSString *pwd = @"zhang";
    NSString *bobyStr = [NSString stringWithFormat:@"username=%@&password=%@", username, pwd];
    
    // 2.2.1 跟服务器的交互,全部传递的二进制
    request.HTTPBody = [bobyStr dataUsingEncoding:NSUTF8StringEncoding];
    
    // 3. 连接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        // 反序列化
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        
        NSLog(@"%@", result);
    }];

}

- (void)getLogin
{
    /**
     GET
     http://127.0.0.1/login.php?username=%@&password=%@
     1. http://127.0.0.1主机地址
     2. login.php是服务器负责登录的脚本(php,java)
     3. ? 后面的就是参数,是给服务器传递的参数
     参数的格式
     变量名=值
     username=@"zhangsan"
     4. & 如果是多个参数,通过这个进行连接。
     */
    
    // 1. url
    NSString *username = @"张三";
    NSString *pwd = @"zhang";
    
    NSString *urlString = [NSString stringWithFormat:@"http://192.168.10.9/login.php?username=%@&password=%@",username, pwd];
    
    // url里面不能包含中文空格特殊符号
    // 如果有,需要百分号转义
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    
    NSURL *url = [NSURL URLWithString:urlString];
    
    
    // 2. 请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:2.0f];
    
    // 3. 连接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        
        // 反序列化
        id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
        
        NSLog(@"%@", result);
    }];
    
}
@end</span>
运行结果如下:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值