Добавить данные в POST NSURLRequest - PullRequest
82 голосов
/ 27 мая 2011

Как вы добавляете данные к существующему POST NSURLRequest? Мне нужно добавить новый параметр userId=2323.

Ответы [ 6 ]

190 голосов
/ 27 мая 2011

Если вы не хотите использовать сторонние классы, то вот как вы установите тело сообщения ...

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];

Просто добавьте вашу пару ключ / значение в строку сообщения

16 голосов
/ 31 декабря 2012

Все изменения в 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];
11 голосов
/ 29 марта 2014

Предыдущие сообщения о формировании 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 более прямой / эффективный.

8 голосов
/ 04 июля 2012

Приведенный выше пример кода был очень полезен для меня, однако (как уже упоминалось выше), я думаю, вам нужно использовать NSMutableURLRequest вместо NSURLRequest.В его нынешнем виде я не смог заставить его ответить на вызов setHTTPMethod.Изменение типа исправленных вещей прямо вверх.

8 голосов
/ 27 мая 2011
 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]];
1 голос
/ 15 сентября 2016

Любой, кто ищет быстрое решение

let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)
...