Get请求 : 从服务端直接获取数据
1.Get请求一般只是从服务器获取数据, 请求时一般会提交服务器一些请求参数, 附加载URL上的, 参数之间以&分割
2.URL中英文和数字进行原样识别, 而中文或者一些其他字符需要计算机再进行编码
3.Get请求提交的数据一般放在http协议的头header中
Post请求 : 上传数据改变服务端的内容
1.Post请求多用于给服务器提交数据
2.Post请求提交的数据一般放在http的主题数据包body中
Get与Post之间的区别 :
数据量的限制不同 :
(1)由于get请求提交的数据是依附于URL中, http协议没规定URL长度及请求参数的个数, 所以理论上不存在大小限制, 但是不同浏览器对支持的URL最大先对有所限制
(2)http协议也没有规定Post请求的大小, 所以理论上post的大小也没有限制。但是往往服务端考虑到处理数据的能力, 会对它做一些限制。 但是一般Post请求数据的量会大于Get请求
安全性不同 :
(1)由于Get请求的数据附加语URL上, 所以提交的数据是可以看见的, 数据包被拦截后也是明文的, 再者浏览器的浏览的历史记录也会被人看见, 加入提交的是用户名和面那就很不安全
(2)Post提交的数据是在body体中, 相对安全性更高一些
请求一般分为三步:
1.创建URL
2.创建请求Request
3.建立连接 完成数据请求
一、同步GET请求(Synchronous)
// 把网址放在字符串中
NSString *strURL = @"http://api.map.baidu.com/place/v2/search?query=银行®ion=大连&output=json&ak=6E823f587c95f0148c19993539b99295";
// 因为网址里面不允许有汉字, 只能有26个字母的大小写, 数字, 和一些特定的符号, 比如&, %, /等, 所以有中文的网址要先把中文变成相对应的数字编码
// 汉字变编码的方法 stringByAddingPercentEscapesUsingEncoding
NSString *strURLEncode = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 1. 创建一个URL
NSURL *url = [NSURL URLWithString:strURLEncode];
// 2. 发送一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3. 建立一个连接
// 参数1: 把创建好的请求发送
// 参数2: 返回的响应信息
// 参数3: 错误信息
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
// 把data进行json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", dic);
NSLog(@"%@", response);
//如果出现的错误是 : data parameter is nil 是因为进行data进行json解析不能是空的, 首先检查网络, 或者是把程序和网络断开, 重新连接
同步POST
// post请求需要在请求的过程中 添加一个body, 添加之后才可以获取数据
NSString *urlStr = @"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx";
// 1. 创建一个URL
NSURL *url = [NSURL URLWithString:urlStr];
// 2. 创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 先指定请求方式, 默认是get请求
[request setHTTPMethod:@"POST"];
// body的字符串
NSString *bodyStr = @"date=20131129&startRecord=1&len=30&udid=1234567890&terminalType=Iphone&cid=213";
// body的字符串变成NSData形式
NSData *bodydata = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
// 把bodydata放到request中
[request setHTTPBody:bodydata];
// 3. 建立一个连接
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 4. 把data进行json解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSArray *arr = dic[@"news"];
for (NSDictionary *dic1 in arr) {
NSLog(@"%@", dic1[@"summary"]);
}
异步GET(AsyncSocket)
#pragma mark - 异步Get请求
#pragma mark - NSURLConnectionDataDelegate
- (IBAction)asynGET:(id)sender {
NSString *strURL = @"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg";
// 1. 创建URL
NSURL *url = [NSURL URLWithString:strURL];
// 2. 创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 3. 建立连接
[NSURLConnection connectionWithRequest:request delegate:self];
// 这个方法可以在2.0到9.0之间的版本使用, 9.0以上的版本不能使用这个方法, 注意!!!!
}
#pragma mark - 会返回响应信息
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
// 这个方法会返回响应信息
// 初始化装数据的容器
self.data = [NSMutableData data];
}
#pragma mark - 接受到服务器返回的数据时调用(如果数据比较多, 这个方法可能会被调用多次)
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSLog(@"接受服务器返回的数据");
// 这个方法会接受返回的数据
// 拼接数据
[self.data appendData:data];
}
#pragma mark - 网络连接时出错时调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"网络连接出错");
}
#pragma mark - 服务器的数据已经接受完毕时调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"服务器的数据已经接受完毕");
// 把图片显示在上面
self.imageView.image = [UIImage imageWithData:self.data];
}