在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>
运行结果如下: