2012-03-04 81 views
1

我有一个小的Mac应用程序,应该可以将数据发布到我的web服务器,该服务器将数据保存在数据库中。现在这是我现在的代码:如何获取URL的页面内容请求(发布)

NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:@"http://..."]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 
    NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (connection) NSLog(@"Done"); 

它工作正常。但是现在我想检查数据是否正确(并存储在数据库中)或者某些事情(如电子邮件)是错误的。 PHP文件打印例如如果电子邮件不正确,请输入“电子邮件地址不正确”。 但是我怎样才能获取这些数据(哪些PHP打印出来)在Xcode的应用程序知道它是否成功或不?

感谢您的回答!

回答

2

为NSURLConnection的实施委托方法,

- (无效)连接:(NSURLConnection的*)连接didReceiveResponse:(NSURLResponse *)响应。 当请求结束时,该方法由应用程序调用。您可以使用'响应'参数访问响应数据。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

然后,只需转换“数据”参数为使用字符串:

NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

然后你可以搜索你想要的任何字符串的响应,例如,“邮件不正确”。 PS:我通常不会对HTTP请求使用NSURLConnection/NSURLRequest,我建议您查看ASIHTTPRequest以获取真正简单的HTTP请求/连接。

希望这会有所帮助。

+0

谢谢你的回答,但是如何将响应转换为字符串? – Dion 2012-03-04 16:10:59

+0

看到我编辑的答案。对困惑感到抱歉。正如我所说的,由于ASIHTTPRequest,我暂时还没有使用NSURLRequest等。强烈建议你检查一下。 – 2012-03-04 16:40:22

+0

啊,非常感谢你,它的工作原理!:) 与ASIHTTPRequest我会稍后退房,对于这个应用程序,我认为这也是好的。 ASIHTTPRequest更合适些什么? – Dion 2012-03-04 21:23:55

3

您需要实现NSURLConnectionDelegate方法connection:didReceiveData:connectionDidFinishLoading:

按照文档didReceiveData:有可能根据的NSURLRequest被调用多次(即响应不会一直到达一次全部),因此推荐的方法是追加传入的数据在connection:didReceiveData:期间缓冲,然后对connectionDidFinishLoading:中的数据进行任何处理。

你可以在你的类创建一个属性是这样的:

@property (nonatomic, strong) NSMutableData *dataBuffer; 

,并在viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.dataBuffer = [[NSMutableData alloc] init]; 

    // do any other setup your class requires...  
} 

实例化缓冲区,然后实现委托方法:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    // clear the buffer in case it has been used previously 
    [self.dataBuffer setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.dataBuffer appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    NSString *response = [NSString stringWithUTF8String:[self.dataBuffer bytes]]); 
    NSLog(@"response from HTTP request=>%@", response); 
} 

这都可以使用像这样的第三方网络库来完成(不再处于积极的开发阶段)或AFNetworking,但有时候这些可能是过度杀毒,取决于你想要完成什么