Подтвердить что ты не робот

NSURLRequest: Опубликовать данные и прочитать опубликованную страницу

В iOS (текущий целевой 5.0, Base SDK 5.1), как я могу отправить запрос на отправку на сервер, а затем прочитать содержимое страницы. Например, страница принимает имя пользователя и пароль, а затем эхо возвращает true или false. Это просто для лучшего понимания NSURLRequest.

Спасибо, Advance!

4b9b3361

Ответ 1

Несколько вещей в первую очередь

  • Решите, как вы хотите кодировать свои данные. Хорошее начало - JSON или url-кодирование.
  • Определите возвращаемое значение - будет 1, TRUE или 0, FALSE или даже YES/non-nil ничего/ничего.
  • Читайте в системе загрузки URL, это ваш друг.

Предназначен для асинхронного подключения всех ваших URL-адресов, чтобы ваш пользовательский интерфейс оставался отзывчивым. Вы можете сделать это с помощью обратных вызовов NSURLConnectionDelegate. NSURLConnection имеет небольшой недостаток: ваш код должен быть развязан. Любые переменные, которые вы хотите использовать в функциях делегата, должны быть сохранены в ivars или в вашем запросе userInfo dict.

В качестве альтернативы вы можете использовать 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];
    }

Использование библиотеки JSON, например JSONKit, упрощает кодирование, подумайте об этом!

Способ 1 - NSURLConnectionDelegate асинхронные обратные вызовы:

// .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 - Функция асинхронной передачи центрального входа:

// .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

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

Надеюсь, что это поможет.

Ответ 2

  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
  }

Ответ 3

Этот проект может быть весьма полезен для вашей цели. Он позаботится о ваших загрузках и сохранит их локально. Проверьте ссылку https://github.com/amitgowda/AGInternetHandler