您的位置:首页 > 其它

GET请求和POST请求剖析

2015-10-27 23:27 435 查看


在HTTP/1.1协议中,定义了8种发送http请求的方法
GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
PUT :增
DELETE :删
POST:改
GET:查
最常用的是GET和POST(实际上GET和POST都能办到增删改查)
要想使用GET和POST请求跟服务器进行交互,得先了解一个概念
参数
就是传递给服务器的具体数据,比如登录时的帐号、密码
缓存是针对URL而言的。
GET与Post的比较如下:
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>
运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: