2013-07-21 4 views
0

Я создаю приложение ios с поддержкой рельсов, которое использует AFNetworking для контента POST на сервере. Пользователь может загрузить фотографию с комментарием - и это работает. Я также хочу иметь возможность позволить пользователю загружать только текст - вот где я испытываю проблемы. У меня есть один способ сохранения фотографии и текста и другой метод сохранения только текста. Метод сохранения фотографий работает, но текстовый метод сохранения создает сообщение, но текст является нулевым. Реализация сохранить фото как это:AFNetworking POST создан, но пустой

- (void)savePhotoAtLocation:(CLLocation *)location 
        withBlock:(void (^)(CGFloat))progressBlock completion:(void (^)(BOOL, NSError *))completionBlock { 

if (!self.content) self.content = @""; 

NSDictionary *params = @{ 
         @"post[content]" : self.content, 
         @"post[lat]": @(location.coordinate.latitude), 
         @"post[lng]": @(location.coordinate.longitude) 

         }; 

NSURLRequest *postRequest = [[APIClient sharedClient] multipartFormRequestWithMethod:@"POST"                    path:@"/posts" parameters:params 
    constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
              { 
               [formData appendPartWithFileData:self.photoData 
                      name:@"post[photo]" 
                     fileName:@"" 
                     mimeType:@"image/png"]; 
              }]; 
    AFHTTPRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:postRequest]; 

Этот метод работает только тогда, когда есть photoData-, если у вас нет photoData, приложение аварий. Так что мне интересно, что эквивалентно multipartFormRequest, который позволяет вам включать только строку? Это то, что у меня есть прямо сейчас, которое создает сообщение post-but return: а также параметры lat/lng, которые должны быть возвращены с текущим местоположением. Это определяется в пост модели

- (void)savePostAtLocation:(CLLocation *)location 
    withBlock:(void (^)(CGFloat progress))progressBlock completion:(void (^)(BOOL success, NSError *error))completionBlock { 

    if (!self.content) self.content = @""; 

    NSDictionary *params = @{ 
          @"post[content]" : self.content, 
          @"post[lat]" : @(location.coordinate.latitude), 
          @"post[lng]" : @(location.coordinate.longitude) 
            }; 

    NSURLRequest *postRequest = [[APIClient sharedClient]requestWithMethod:@"POST" path:@"/posts" parameters:params]; 

    AFHTTPRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:postRequest]; 

     [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (operation.response.statusCode == 200 || operation.response.statusCode == 201) { 
      NSLog(@"Created, %@", responseObject); 
      NSDictionary *updatedPost = [responseObject objectForKey:@"post"]; 
      [self updateFromJSON:updatedPost]; 
      [self notifyCreated]; 
      completionBlock(YES, nil); 
     } else { 
      completionBlock(NO, nil); 
     } 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     completionBlock(NO, error); 
     }]; 

    [[APIClient sharedClient] enqueueHTTPRequestOperation:operation]; 
} 

И в AddPostViewController СОХРАНИТЬ называет это:

- (void)save:(id)sender 

{ 
    CLLocationManager * locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    self.locationManager.distanceFilter = 80.0f; 
    [locationManager startUpdatingLocation]; 
    [self getLocation]; 
    CLLocation * location = [locationManager location]; 

    Post *post = [[Post alloc] init]; 
    post.content = self.contentTextField.text; 

    [self.view endEditing:YES]; 

    ProgressView *progressView = [ProgressView presentInWindow:self.view.window]; 
    if (location) { 

    [post savePostAtLocation:self.locationManager.location withBlock:^(CGFloat progress) { 
     [progressView setProgress:progress]; 
    } completion:^(BOOL success, NSError *error) { 
     [progressView dismiss]; 
     if (success) { 
      [self.navigationController popViewControllerAnimated:YES]; 
     } else { 
      NSLog(@"ERROR: %@", error); 
     } 
    }]; 
    } else { 
     NSLog(@"No Location"); 
    } 
} 

Вот журнал после того, как пост создается. Как видите, атрибуты имеют нулевое значение и не должны быть.

Created, { 
    post =  { 
     content = "<null>"; 
     "created_at" = "2013-07-21T18:45:12Z"; 
     id = 13; 
     lat = "<null>"; 
     lng = "<null>"; 

    success = 1; 
} 

Поэтому тот факт, что сообщение создается, но атрибуты равны нулю заставляет меня думать, что проблема просто в NSURLRequest- и что я не полностью реализует протокол AFNetworking, но я не смог найти способ реализации почтового запроса, который не влечет за собой fileData. Как создать почтовый запрос, который не добавляет fileData? Любая помощь будет принята с благодарностью. Спасибо!

+0

Что на самом деле Безразлично» т работы? Что ожидает сервер? Непонятно, что вы просите. – Wain

+0

@Wain Создается сообщение, но параметры из словаря пусты. Содержимое равно null, а также lat и lng null. Я включу журнал из успешной почты выше, чтобы вы могли видеть. – grantvansant

+0

Словарь не может содержать 'nil'. Если вы попытаетесь установить 'nil', вы получите исключение. Что ожидает сервер для получения, это проблема с подбором параметров POST? – Wain

ответ

0

Это, как я получил его на работу: post.h

+ (void)createNoteAtLocation:(CLLocation *)location 
       withContent:(NSString *)content 
         block:(void (^)(Post *post))block; 

post.m

+ (void)createNoteAtLocation:(CLLocation *)location 
       withContent:(NSString *)content 
         block:(void (^)(Post *post))block 
{ 
    NSDictionary *parameters = @{ @"post": @{ 
              @"lat": @(location.coordinate.latitude), 
              @"lng": @(location.coordinate.longitude), 
              @"content": content 
              } 
            }; 

    [[APIClient sharedClient] postPath:@"/posts" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     Post *post = [[Post alloc] initWithDictionary:responseObject]; 
     if (block) { 
      block(post); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     if (block) { 
      block(nil); 
     } 
    }]; 
} 

И, наконец, в createPostViewController:

- (void)save:(id)sender 

{ 
    CLLocationManager * locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
    self.locationManager.distanceFilter = 80.0f; 
    [locationManager startUpdatingLocation]; 

    [self getLocation]; 
    CLLocation * location = [locationManager location]; 


    Post *post = [[Post alloc] init]; 
    post.content = self.contentTextField.text; 

    [self.view endEditing:YES]; 

    if (location) { 

     [Post createNoteAtLocation:location withContent:self.contentTextField.text block:^(Post *post) { 
      NSLog(@"Block: %@", post); 
      [self.navigationController popViewControllerAnimated:YES]; 
     }]; 
    } 
1

Вы можете скопировать существующий метод, но вместо того, чтобы использовать appendPartWithFileData:name:fileName:mimeType: для установки данных файла, вы можете преобразовать свои параметры в данные и добавить их с помощью appendPartWithFormData:name:.

Смежные вопросы