NSURLRequest:发布数据并阅读发布的页面

在iOS(当前目标5.0,Base SDK 5.1)中,如何向服务器发送发布请求,然后读取页面的内容。 例如,页面接受用户名和密码,然后回显true或false。 这只是为了更好的理解NSURLRequest。

提前致谢!

首先有几件事

  • 决定如何编码数据–JSON或URL编码是一个好的开始。
  • 决定返回值 – 它是1,TRUE还是0,FALSE,甚至YES / NO-NIL,无/无。
  • 阅读URL加载系统 ,这是你的朋友。

旨在使所有的url连接asynchronous,以便您的用户界面保持响应。 你可以用NSURLConnectionDelegatecallback来做到这一点。 NSURLConnection有一个小缺点:你的代码必须解耦。 你想在委托函数中可用的任何variables将需要保存到ivars或在您的请求的userInfo字典。

或者,您可以使用GCD,当与__block限定符结合使用时,您可以在声明它的位置指定错误/返回代码 – 对于一次提取非常有用。

毫不迟疑,这是一个快速和肮脏的url编码器:

- (NSData*)encodeDictionary:(NSDictionary*)dictionary { NSMutableArray *parts = [[NSMutableArray alloc] init]; for (NSString *key in dictionary) { NSString *encodedValue = [[dictionary objectForKey:key] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *encodedKey = [key stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *part = [NSString stringWithFormat: @"%@=%@", encodedKey, encodedValue]; [parts addObject:part]; } NSString *encodedDictionary = [parts componentsJoinedByString:@"&"]; return [encodedDictionary dataUsingEncoding:NSUTF8StringEncoding]; } 

使用像JSONKit这样的JSON库使编码更容易,请考虑!

方法1 – NSURLConnectionDelegateasynchronouscallback:

 // .h @interface ViewController : UIViewController<NSURLConnectionDelegate> @end // .m @interface ViewController () { NSMutableData *receivedData_; } @end ... - (IBAction)asyncButtonPushed:(id)sender { NSURL *url = [NSURL URLWithString:@"http://localhost/"]; NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:@"user", @"username", @"password", @"password", nil]; NSData *postData = [self encodeDictionary:postDict]; // Create the request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start]; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [receivedData_ setLength:0]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [receivedData_ appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"Succeeded! Received %d bytes of data", [receivedData_ length]); NSString *responeString = [[NSString alloc] initWithData:receivedData_ encoding:NSUTF8StringEncoding]; // Assume lowercase if ([responeString isEqualToString:@"true"]) { // Deal with true return; } // Deal with an error } 

方法2 – Grand Central调度asynchronousfunction:

 // .m - (IBAction)dispatchButtonPushed:(id)sender { NSURL *url = [NSURL URLWithString:@"http://www.apple.com/"]; NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:@"user", @"username", @"password", @"password", nil]; NSData *postData = [self encodeDictionary:postDict]; // Create the request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Peform the request NSURLResponse *response; NSError *error = nil; NSData *receivedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (error) { // Deal with your error if ([response isKindOfClass:[NSHTTPURLResponse class]]) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; NSLog(@"HTTP Error: %d %@", httpResponse.statusCode, error); return; } NSLog(@"Error %@", error); return; } NSString *responeString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; // Assume lowercase if ([responeString isEqualToString:@"true"]) { // Deal with true return; } // Deal with an error // When dealing with UI updates, they must be run on the main queue, ie: // dispatch_async(dispatch_get_main_queue(), ^(void){ // // }); }); } 

方法3 – 使用NSURLConnection便利function

 + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler 

希望这可以帮助。

  NSData *postData = [someStringToPost dataUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:someURLString]; NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url]; [req setHTTPMethod:@"POST"]; [req setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"]; [req setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [req setHTTPBody:postData]; NSError *err = nil; NSHTTPURLResponse *res = nil; NSData *retData = [NSURLConnection sendSynchronousRequest:req returningResponse:&res error:&err]; if (err) { //handle error } else { //handle response and returning data } 

这个项目可能对您的目的非常方便。 它会照顾你的下载并将其存储在本地。 查看链接https://github.com/amitgowda/AGInternetHandler