Я создаю приложение 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? Любая помощь будет принята с благодарностью. Спасибо!
Что на самом деле Безразлично» т работы? Что ожидает сервер? Непонятно, что вы просите. – Wain
@Wain Создается сообщение, но параметры из словаря пусты. Содержимое равно null, а также lat и lng null. Я включу журнал из успешной почты выше, чтобы вы могли видеть. – grantvansant
Словарь не может содержать 'nil'. Если вы попытаетесь установить 'nil', вы получите исключение. Что ожидает сервер для получения, это проблема с подбором параметров POST? – Wain