Как вы добавляете данные к существующим POST
NSURLRequest
? Мне нужно добавить новый параметр userId=2323
.
83
Как вы добавляете данные к существующим POST
NSURLRequest
? Мне нужно добавить новый параметр userId=2323
.
Ответы:
Если вы не хотите использовать сторонние классы, то вот как вы устанавливаете тело сообщения ...
NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [request setHTTPMethod:@"POST"]; NSString *postString = @"company=Locassa&quality=AWESOME!"; [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request delegate:self];
Просто добавьте свою пару ключ / значение в строку сообщения
источник
Все изменения
NSMutableURLRequest
необходимо внести до звонкаNSURLConnection
.Я вижу эту проблему, когда копирую и вставляю приведенный выше код, запускаю
TCPMon
и вижу, что запросGET
вместо ожидаемогоPOST
.NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; [request setHTTPMethod:@"POST"]; NSString *postString = @"company=Locassa&quality=AWESOME!"; [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request delegate:self];
источник
Предыдущие сообщения о формировании
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
более прямолинейно / действенно.источник
stringByAddingPercentEscapesUsingEncoding:
, ноstringByAddingPercentEncodingWithAllowedCharacters:
отлично работает с любым персонажем. Пример:URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
, но вы не можете использоватьURLQueryAllowedCharacterSet
, поскольку это включает+
и&
(это разрешенный символ в рамках более широкого запроса, но если эти символы появляются в значении в запросе, они должны экранироваться, что этот набор символов не будет делать ). Таким образом, вы можете использовать либоURLQueryAllowedCharacterSet
для создания изменяемого набора символов и удаления нескольких символов, которые они туда включили, либо создать свой собственный набор символов с нуля. Или используйтеCFURLCreateStringByAddingPercentEscapes
.CFURLCreateStringByAddingPercentEscapes
это теперь не рекомендуется, вам действительно следует создать соответствующий набор символов самостоятельно. См. Stackoverflow.com/a/54742187/1271826 .NSURL *url= [NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod:@"POST"]; NSString *postString = @"userId=2323"; [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
источник
Приведенный выше пример кода был мне очень полезен, однако (как было указано выше), я думаю, вам нужно использовать
NSMutableURLRequest
вместоNSURLRequest
. В его нынешнем виде я не мог заставить его ответить наsetHTTPMethod
звонок. Изменение типа исправило все сразу.источник
Любой, кто ищет быстрое решение
let url = NSURL(string: "http://www.apple.com/") let request = NSMutableURLRequest(URL: url!) request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)
источник