Предыдущие сообщения о формировании POST
запросов в основном верны (добавьте параметры в тело, а не в URL).Но если есть вероятность того, что входные данные содержат какие-либо зарезервированные символы (например, пробелы, амперсанд и знак плюс), то вы захотите обработать эти зарезервированные символы.А именно, вы должны в процентах избегать ввода.
//create body of the request
NSString *userid = ...
NSString *encodedUserid = [self percentEscapeString:userid];
NSString *postString = [NSString stringWithFormat:@"userid=%@", encodedUserid];
NSData *postBody = [postString dataUsingEncoding:NSUTF8StringEncoding];
//initialize a request from url
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPBody:postBody];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
//initialize a connection from request, any way you want to, e.g.
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
Где метод precentEscapeString
определяется следующим образом:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Обратите внимание, что был многообещающий метод NSString
,stringByAddingPercentEscapesUsingEncoding
(сейчас не рекомендуется), это делает что-то очень похожее, но не поддавайтесь искушению использовать это.Он обрабатывает некоторые символы (например, пробел), но не некоторые другие (например, +
или &
символы).
Современный эквивалент stringByAddingPercentEncodingWithAllowedCharacters
, но, опять же, нене должно быть соблазна использовать URLQueryAllowedCharacterSet
, поскольку это также позволяет +
и &
проходить без экранирования.Эти два символа разрешены в более широком «запросе», но если эти символы появляются в значении в запросе, они должны быть экранированы.Технически, вы можете использовать URLQueryAllowedCharacterSet
для создания изменяемого набора символов и удалить несколько символов, которые они там включили, или создать свой собственный набор символов с нуля.
Например, если выпосмотрите на кодировку параметров Alamofire , они берут URLQueryAllowedCharacterSet
и затем удаляют generalDelimitersToEncode
(который включает символы #
, [
, ]
и @
, но из-за историческогоошибка в некоторых старых веб-серверах, ни ?
, ни /
), ни subDelimitersToEncode
(то есть !
, $
, &
, '
, (
, )
, *
,+
, ,
, ;
и =
).Это правильная реализация (хотя вы можете обсудить удаление ?
и /
), хотя и довольно запутанная.Возможно, CFURLCreateStringByAddingPercentEscapes
более прямой / эффективный.