如何获取URL请求的页面内容(发布)

时间:2012-03-04 15:50:13

标签: objective-c xcode

我有一个小应用程序应该可以将数据发布到我的Web服务器,它将数据保存在数据库中。现在这就是我现在的代码:

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");

它工作正常。但现在我想检查数据是否正确(并存储在数据库中)或某些内容(如eMail)是错误的。 PHP文件打印例如如果电子邮件不正确,则“电子邮件不正确”。 但是如何在Xcode中获取该数据(哪些PHP打印出来)应用程序知道它是否成功?

感谢您的回答!

2 个答案:

答案 0 :(得分: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);
}

这一切都可以使用像ASIHTTPRequest这样的第三方网络库(不再处于积极开发阶段)或AFNetworking来完成,但有时候根据您的尝试情况可能会有些过分完成

答案 1 :(得分:2)

实施NSURLConnection的委托方法

<德尔>      - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response。 当请求完成时,app会调用此方法。您可以使用'response'参数访问响应数据。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

然后使用以下命令将'data'参数转换为字符串:

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

然后,您可以搜索您想要的任何字符串的响应,例如“电子邮件不正确”。

PS:我通常不会对HTTP请求使用NSURLConnection / NSURLRequest,我建议您查看ASIHTTPRequest以获取非常简单的HTTP请求/连接。

希望这有帮助。