Создание почтового запроса в iOS

Для начала я посмотрел, как сделать запрос на публикацию, и прочитал несколько потоков и документов о том, как его создать, однако мои данные, похоже, не работают. У меня есть два поля: x и html, которые я хочу сделать для имени вызова. Форма GET для этого будет выглядеть так: www.someserver.com/callname?x=something&y=something Вот как выглядит мой POST-код:

NSString *baseURLString = @"http://www.someserver.com/callname"
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[[NSURL URLWithString:baseURLString] standardizedURL]];
NSString *fields = [NSString stringWIthFormat:@"x=%@&html=%@",x,htmlSource];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[NSData dataWithBytes:[fields UTF8String] length:strlen([fields UTF8String])]];

NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];

Методы делегата NSURLConnection, реализованные как таковые

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"Data Received");
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    NSLog(@"Error: %@" , error);
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Connection Finished");
}

Я что-то пропустил? Мой код выглядит почти так же, как и большинство примеров, которые я нашел, за исключением выбора кодировки. Имеет ли значение, что я передаю исходный код html в качестве значения y? Любые советы или подсказки будут оценены. Я очень новичок в iOS и обработке html в целом, поэтому извините за отсутствие знаний по этому вопросу. Спасибо за ваше время!


person CoderNinja    schedule 12.02.2014    source источник
comment
Мне очень любопытно, откуда вы это взяли: application/x-www-form-urlencoded; charset=utf-8"   -  person CouchDeveloper    schedule 13.02.2014
comment
Боюсь, вам даже нужно больше узнать о том, как правильно процентно кодировать список параметров в application/x-www-form-urlencoded содержимом. ;)   -  person CouchDeveloper    schedule 13.02.2014


Ответы (4)


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

person Gavin    schedule 12.02.2014
comment
Нужно ли мне реализовать этот делегат, чтобы вызов был успешным? или это посмотреть, какой ответ я получаю от сервера - person CoderNinja; 13.02.2014
comment
Вам не нужно реализовывать его для успешного вызова, но вам нужно будет реализовать его, чтобы узнать, удалось ли это или нет, и увидеть, какой ответ вы получили. Таким образом, вы почти всегда хотели бы реализовать это. - person Gavin; 13.02.2014
comment
Однако вы можете упростить ситуацию, если будете использовать для своих запросов стороннюю библиотеку, такую ​​как AFNetworking. Затем вы можете использовать блочный синтаксис для обратных вызовов вместо реализации методов делегата и тому подобного. - person Gavin; 13.02.2014
comment
Я реализовал методы и получил сообщение о завершении соединения. Данные не получены или сообщение об ошибке - person CoderNinja; 13.02.2014
comment
Вы реализовали методы делегата для получения данных? - person Gavin; 13.02.2014
comment
Ах, я вижу, что вы отредактировали свой вопрос, чтобы показать им. Ну, может быть, он вообще не отправляет никаких данных по какой-то причине. Попробуйте использовать что-то вроде плагина POSTMAN Chrome для выполнения вашего POST-запроса и посмотрите, получит ли он что-нибудь в ответ. - person Gavin; 13.02.2014
comment
Ну, я сделал звонок внутри приложения, и это сработало, лол. Но это все еще оставляет меня в недоумении, почему мой звонок не работает. Я неправильно настроил значение ключа? Имеет ли значение, что я передаю прямой исходный код html в параметр html=%@? - person CoderNinja; 13.02.2014
comment
Это может быть все. Вам нужно будет экранировать HTML для правильной обработки. - person Gavin; 13.02.2014

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

При использовании таких параметров, как в вашем коде с типом контента application/x-www-form-urlencoded, я бы предложил создать ваши параметры как (незакодированные) пары ключ/значение NSString, создать объект NSDictionary и использовать следующий вспомогательный метод, описанный в ответе здесь (Как отправить несколько параметров на сервер PHP в HTTP post), который создает правильно закодированную строку параметров, которую вы можете добавить в тело.

person CouchDeveloper    schedule 12.02.2014

Я считаю, что закодированный URL-адрес вашей формы неверен. Я считаю, что решение следующее

[serviceRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

Если вы хотите кодировать свои значения в UTF-8, вам нужно сделать это раньше, например,

NSString *postLength = [NSString stringWithFormat:@"%d", [_xmlDoc length]]; //Calculating the Content Length
    NSData *postData = [_xmlDoc dataUsingEncoding:NSUTF8StringEncoding]; // preparing XML to be sent in POST

Обратите внимание, что вы заранее кодируете строку данных POST.

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

person Corporate One    schedule 10.03.2014

Ваш код работает для меня. Вы не забыли запустить [connection start]; ?

person gw_    schedule 12.02.2014
comment
Мне нужно вызывать это напрямую? У меня есть if(connection) NSLog(Connection Successful); И я вижу сообщение. Они означают разные вещи? Я также получаю сообщение о завершении соединения от делегата - person CoderNinja; 13.02.2014
comment
if(connection) подтверждает только то, что вы успешно создали объект. Чтобы на самом деле запустить соединение, вам нужно вызвать метод start. Для подтверждения подключения следует использовать NSURLConnectionDelegate методы. - person gw_; 13.02.2014
comment
Маловероятно, что код ОП такой же, как у вас. То, работает ли код (как ожидается), зависит от параметров x и htmlSource, в частности, правильно ли они закодированы в процентах. Кроме того, OP использовал метод инициализации, который немедленно запускает соединение, то есть start не требуется. - person CouchDeveloper; 13.02.2014