IOS网络编程:HTTP

转载 2015年07月07日 18:36:18

HTTP定义了一种在服务器和客户端之间传递数据的途径。

URL定义了一种唯一标示资源在网络中位置的途径。

REQUESTS 和 RESPONSES:

客户端先建立一个TCP连接,然后发送一个请求。服务器受到请求处理后发送一个响应向客户端传递数据。然后客户端可以继续发送请求或者关闭这个TCP连接。

HTTPS:
在TCP连接建立后,发送请求之前,需要建立一个一个SSL会话。

request方法和它们的用途

 

注意:想server发送大量数据需要用POST,因为GET仅支持发送少量数据(8KB)。

 

iOS的NSURLRequest和它的子类NSMutableURLRequest提供了建立HTTP请求的方法。

NSURLResponse 和 它的子类NSHTTPURLResponse 处理返回的数据。

URL:

Protocol包括HTTP、FTP和file。

URL编码:

NSString *urlString = @"http://myhost.com?query=This is a question"; 
NSString *encoded = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL用来管理URL。

IOS HTTP APIS:

涉及到下面一些类:

NSURLNSURLRequestNSURLConnection, 和 NSURLResponse.

1、NSURL

NSURL可以定义本地文件和网络文件

NSURL *url = [NSURL urlWithString:@"http://www.google.com"]; 
NSData *data = [NSData dataWithContentsOfURL:url];

NSURL定义了很多访问器:

if (url.port == nil) { 
  NSLog(@"Port is nil"); } else {   NSLog(@"Port is not nil"); }

2、NSURLRequest

创建了NSURL后,就可以用NSURLRequest建立请求了:

复制代码
NSURL *url = [NSURL URLWithString: @"https://gdata.youtube.com/feeds/api/standardfeeds/top_rated"];
if (url == nil) {
     NSLog(@"Invalid URL"); 

   return; } NSURLRequest *request = [NSURLRequest requestWithURL:url];

if (request == nil) {   NSLog(@"Invalid Request"); return; }
复制代码

NSMutableURLRequest是NSURLRequest 的子类,提供了改变请求的属性的方法:

NSURL *url = [NSURL urlWithString@"http://server.com/postme"]; 
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"]; [req setHTTPBody:[@"Post body" dataUsingEncoding:NSUTF8StringEncoding]];

如果你要发送一个图片或者视频,那么用需要用NSInputStream,它没有把数据全部加在到内存。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSInputStream *inStream = [NSInputStream inputStreamWithFileAtPath:srcFilePath];
[request setHTTPBodyStream:inStream];
[request setHTTPMethod:@"POST"];

 

3、NSURLResponse

 

 

4、NSURLConnection

提供了初始化、开始、和取消一个连接。

发送同步请求:

复制代码
- (NSArray *) doSyncRequest:(NSString *)urlString {
    // make the NSURL object from the string
    NSURL *url = [NSURL URLWithString:urlString];
    
    // Create the request object with a 30 second timeout and a cache policy to always retrieve the
    // feed regardless of cachability.
    NSURLRequest *request = 
       [NSURLRequest requestWithURL:url 
                        cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
                    timeoutInterval:30.0];
    
    // Send the request and wait for a response
    NSHTTPURLResponse   *response;
    NSError             *error;
    NSData *data = [NSURLConnection sendSynchronousRequest:request 
                                         returningResponse:&response 
                                                     error:&error];
    // check for an error
    if (error != nil) {
        NSLog(@"Error on load = %@", [error localizedDescription]);
        return nil;
    }
    
    // check the HTTP status
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        if (httpResponse.statusCode != 200) {
            return nil;
        }
        NSLog(@"Headers: %@", [httpResponse allHeaderFields]);
    }
    
    // Parse the data returned into an NSDictionary
    NSDictionary *dictionary = 
        [XMLReader dictionaryForXMLData:data 
                                  error:&error];
    // Dump the dictionary to the log file
    NSLog(@"feed = %@", dictionary);
    
    NSArray *entries =[self getEntriesArray:dictionary];
    
    // return the list if items from the feed.
    return entries;

}
复制代码

 

 

Queued Asynchronous Requests:

复制代码
- (void) doQueuedRequest:(NSString *)urlString  delegate:(id)delegate {
    // make the NSURL object
    NSURL *url = [NSURL URLWithString:urlString];
    
    // create the request object with a no cache policy and a 30 second timeout.
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:30.0];
    
    // If the queue doesn't exist, create one.
    if (queue == nil) {
        queue = [[NSOperationQueue alloc] init];
    }
    
    // send the request and specify the code to execute when the request completes or fails.
    [NSURLConnection sendAsynchronousRequest:request 
                                       queue:queue 
                           completionHandler:^(NSURLResponse *response, 
                                               NSData *data, 
                                               NSError *error) {
                               
            if (error != nil) {
               NSLog(@"Error on load = %@", [error localizedDescription]);
            } else {
                
                // check the HTTP status
                if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
                    if (httpResponse.statusCode != 200) {
                        return;
                    }
                    NSLog(@"Headers: %@", [httpResponse allHeaderFields]);
                }
                               
                // parse the results and make a dictionary
                NSDictionary *dictionary = 
                   [XMLReader dictionaryForXMLData:data 
                                             error:&error];
                NSLog(@"feed = %@", dictionary);

                // get the dictionary entries.
                NSArray *entries =[self getEntriesArray:dictionary];

                // call the delegate
                if ([delegate respondsToSelector:@selector(setVideos:)]) {
                    [delegate performSelectorOnMainThread:@selector(setVideos:) 
                                               withObject:entries 
                                            waitUntilDone:YES];
                }
            }
    }];
}
复制代码

 

NSURLConnection start方法和Delegate:

GET:

复制代码
 NSURL  *url=[[ NSURL   alloc ] initWithString :urlString];

     NSMutableURLRequest  *request=[[NSMutableURLRequest  alloc ] init ];



     NSURLConnection  *connection = [[ NSURLConnection   alloc ]  initWithRequest :request delegate : self ];
     if (connection)
     {
             [connection start];
         }
     else
     {
             NSLog ( @"sorry" );
     }

/*
* NSURLConnectionDataDelegate
*/
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response
{
  [activityIndicator startAnimating]; //UIActivityIndicatorView NSLog(
@"Did Receive Response %@", response); responseData = [[NSMutableData alloc]init]; } - (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data { //NSLog(@"Did Receive Data %@", data); [responseData appendData:data]; //NSMutableData } - (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error { NSLog(@"Did Fail"); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   [activityIndicator stopAnimating];

    NSLog(@"Did Finish");
    // Do something with responseData
}
复制代码

POST:

复制代码
//initialize new mutable data
    NSMutableData *data = [[NSMutableData alloc] init];
    self.receivedData = data;
    
    //initialize url that is going to be fetched.
    NSURL *url = [NSURL URLWithString:@"http://www.snee.com/xml/crud/posttest.cgi"];
    
    //initialize a request from url
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[url standardizedURL]];
    
    //set http method
    [request setHTTPMethod:@"POST"];
    //initialize a post data
    NSString *postData = [[NSString alloc] initWithString:@"fname=example&lname=example"];
    //set request content type we MUST set this value.
    
    [request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    //set post data of request
    [request setHTTPBody:[postData dataUsingEncoding:NSUTF8StringEncoding]];
    
    //initialize a connection from request
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    self.connection = connection;
    //start the connection
    [connection start];
复制代码

 异步请求:
异步请求需要一个run loop来操作代理对象,GCD和NSOperationQueue默认并没有run loop,所以如果你想在后台发起一个HTTP请求,必须确保有run loop。

NSURLConnection connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];

上面的代码是在主线程运行,如果想在其他线程运行,可以在其他线程新建一个run loop,并绑定到connection

iOS经典讲解之网络编程 TCP/UDP HTTP

一、HTTP协议的主要特点:(摘自 仰望星空 的博客)重点内容  1. CS模式  2. 简单快速:只需要传送请求方法和路径。(常用方法有GET,HEAD,POST)  3. 灵活:任意对象都可...
  • Loving_iOS
  • Loving_iOS
  • 2015年12月28日 21:44
  • 5850

网络编程概述及Http协议

(一)概述 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程要干嘛?Http协议 的学习,使用自带扣脚Json解析类解析Json,XML解析的几种常用方式,Http...
  • MakeYourChance
  • MakeYourChance
  • 2016年07月05日 20:56
  • 4056

iOS网络编程————POST请求和GET请求

iOS网络编程内容很多,也很重要,小编慢慢总结,慢慢来讲。 iOS的网络编程主要涉及两者:客户端和服务器端,上传和下载数据都是客户端通过访问服务器端来实现的。 服务器端开发语言有Java,.Net,C...
  • Lerryteng
  • Lerryteng
  • 2016年04月25日 22:48
  • 3192

Qt网络编程-http操作

前几天看到了一个关于Qt网络相关操作的博客,里面讲述的是如何从百度里面下载音乐和试听音乐的,感觉挺神秘的,当然更多的是好奇,这样利用这个东东不是以后可以做很多东西,可以从一些网站上获取自己需要的信息,...
  • lmzqm
  • lmzqm
  • 2014年01月12日 15:32
  • 1308

Java中基于HTTP协议网络编程

java中为我们的网络支持提供了java.net包,能够使我们以编程的方式来访问Web服务功能...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015年12月11日 09:19
  • 1918

Java网络编程从入门到精通(20):HTTP协议简介

转自: http://www.blogjava.net/nokiaguy/archive/2009/05/archive/2009/05/archive/2009/05/archive/2009/0...
  • DADADIE
  • DADADIE
  • 2015年04月16日 17:09
  • 1287

赵雅智_java网络编程(4)TCP/IP、Http和Socket的区别

通过java网络编程(1)网络体系结构及通信协议我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决...
  • zhaoyazhi2129
  • zhaoyazhi2129
  • 2014年10月24日 10:09
  • 1363

iOS 网络编程 http

转自:http://blog.csdn.net/hgy2011/article/details/8676084 http编程综述:亦可称为soap编程。通常情况下,http编程要比socket编程相...
  • u011774517
  • u011774517
  • 2016年05月02日 09:02
  • 264

IOS网络编程:HTTP

HTTP定义了一种在服务器和客户端之间传递数据的途径。 URL定义了一种唯一标示资源在网络中位置的途径。   REQUESTS 和 RESPONSES: 客户端先建立一...
  • Liar0606
  • Liar0606
  • 2014年02月13日 13:15
  • 760

iOS之HTTP网络编程

iOS之同步请求、异步请求、GET请求、POST请求 1、同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,知道服务器返回数据完成,才可以进行下一步操作; 2、异步请求不会阻塞主...
  • qq_27788829
  • qq_27788829
  • 2016年02月25日 21:42
  • 293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS网络编程:HTTP
举报原因:
原因补充:

(最多只允许输入30个字)