`
jishublog
  • 浏览: 861870 次
文章分类
社区版块
存档分类
最新评论

IOS网络编程基础——GET 以及 POST

 
阅读更多

HTTP和HTTPS


Internet的基本协议是TCP/IP协议,广泛采用的是建立在TCP/IP协议上的应用层协议,比如HTTP,HTTPS,FTP等等。不同的协议对应不同的应用。

WebService主要使用的是超文本传输协议,也就是HTTP协议。他属于一个应用层的面向对象的协议。而HTTPS则在HTTP下加入SSL安全层。




GET请求


GET与POST同为与服务器进行数据交互的方法。记得在大学学PHP的时候,老师让背GET与POST方法的各自特性,我好像背了好长时间- -,但是其实一使用就了解特点了。

先写一个GET的URL示例 : 网址/login.php?username=rannier&password=111111

我们可以看到在login.php后面有一个?将数据内容和主页链接连接,数据变量和值对形式出现,中间有&连接。

总结的GET的特点:

(1) GET是"获取"指定URL上的资源。
(2) 其将数据按照varialbe = value的形式,添加action到所指向的URL后面,并且两者使用"?"连接,各个变量之间用"&"连接。
(3) 不安全,因为在传输过程中,数据被放在请求的URL中。这样很容易被人拿到看见数据信息。
(4) 传输的数据量比较小


POST请求


URL示例: 网址/login.php

我们发现URL只是个链接,而数据并没有在这个URL中,所以需要在请求中传入请求的数据体,然后想服务器发出请求。

POST的特点:

(1)POST语意是指对指定内容添加和追加数据(通过数据体的形式)
(2)将数据放在数据体中,按照变量和值相对应的方式,传递到action所指向的URL
(3)所有的数据对用户不可见,也就是从URL中看不到。
(4)可以传输大量数据,传输文件只能用POST
(5)不过对服务器来说,接收数据体可能会不安全

网络访问步骤


访问网络的基本步骤一般为:

建立链接——建立请求——开始连接——连接完成,处理结果。

在IOS中涉及到的类有

NSURL
NSURLRequest 一般GET请求使用
NSMutableURLRequest 一般POST请求使用
NSURLConnection 连接

用到的代理为NSURLConnectionDelegate
代理方法在示例中标明

GET与POST基础示例


- (void)startGETConnection
{
    static NSString * const BaiduURL = @"http://www.baidu.com/s?wd=nihao&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&rsv_sug3=3&rsv_sug=0&rsv_sug1=3&rsv_sug4=36";
    
    NSURL *url = [NSURL URLWithString:BaiduURL];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    
    [conn start];
}

这个URL是一个从百度搜索nihao的一个请求,
看下代理方法

// 接收到回应执行
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"收到回应");
    if (!_data)
    {
        _data = [NSMutableData data];
    }
}

// 收到数据对数据进行拼接
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_data appendData:data];
}

// 连接执行结束时候调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSString *output = [[NSString alloc] initWithData:_data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", output);
    
    _data = nil;
}


看下收到的数据部分



百度知道里面的回复


同样的请求使用POST方法的代码

- (void)startPOSTConnection
{
    static NSString * const BaiduSearch = @"http://weibo.com/rannie";
    static NSString * const SearchBody = @"wvr=5&";
    
    NSURL *url = [NSURL URLWithString:BaiduSearch];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                       timeoutInterval:3.0f];   //缓存策略以及最长加载时间
    // 设置执行方式
    request.HTTPMethod = @"post";
    request.HTTPBody = [SearchBody dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];
    NSLog(@"执行POST");
}

打印结果开头部分

2013-09-01 00:23:10.114 GetAndPostDemo[1824:c07] 执行POST
2013-09-01 00:23:10.253 GetAndPostDemo[1824:c07] 收到回应
2013-09-01 00:23:10.253 GetAndPostDemo[1824:c07] 收到数据
2013-09-01 00:23:10.254 GetAndPostDemo[1824:c07] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<title>错误提示 新浪微博-随时随地分享身边的新鲜事儿</title>

因为是随便传的数据 所以新浪会跳到注册登录的那个页面去。

同步与异步加载


同步和异步的简单理解:
同步是阻塞式方法,即调用方法如果没有收到系统的回复通知该方法执行完毕,则会阻塞在该同步方法上。这个方法执行完才会执行下个方法。
而异步则不需要向同步一样,异步不会干扰之后方法的调用,CPU会尽快的调用资源完成该方法但是该方法没有完成后面的方法也可以执行。

由于这些代理方法跳跃性比较强,看起来复杂一些,苹果给NSURLConnection封装了一些类方法来执行同步(Sync)或者异步(Async)请求

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
参数不难理解,第二个和第三个传入的是响应对象和错误对象的地址。
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
一个请求对象,
第二个是多线程中可能会使用的NSOperationQueue队列,刚才那个方法进行改写的话,传入的就为主运行队列[NSOperationQueue mainQueue] 最后一个参数为一个BLOCK,可以对BLOCK参数进行一些处理。


这篇博客的内容比较基础,对协议和网络通讯理解深的话对开发还是蛮有帮助,对后面ASI,AFN等常用框架的学习与使用也更能得心应手。
Demo源码:点击打开链接



以上就为本篇博客全部内容,欢迎指正和交流。转载请注明出处~


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics