Как вы добавляете данные в существующий POST NSURLRequest? Мне нужно добавить новый параметр userId=2323.
Добавление данных в POST NSURLRequest
Ответ 1
Если вы не хотите использовать сторонние классы, то следующим образом вы устанавливаете тело сообщения...
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];
Просто добавьте пару ключ/значение в строку сообщения
Ответ 2
Все изменения в 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];
Ответ 3
Предыдущие сообщения о формировании запросов 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)@":/[email protected]!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Обратите внимание, что существует многообещающий метод NSString, stringByAddingPercentEscapesUsingEncoding (теперь он устарел), который делает что-то очень похожее, но не поддается искушению использовать его. Он обрабатывает некоторые символы (например, символ пробела), но не некоторые из других (например, символы + или &).
Современный эквивалент stringByAddingPercentEncodingWithAllowedCharacters, но, опять же, не будет соблазн использовать URLQueryAllowedCharacterSet, поскольку это также позволяет пропускать + и & без сохранения. Эти два символа разрешены в более широком "запросе", но если эти символы появляются внутри значения внутри запроса, они должны сбежать. Технически вы можете использовать URLQueryAllowedCharacterSet для создания изменяемого набора символов и удаления нескольких символов, которые они там включили, или создать собственный набор символов с нуля.
Например, если вы посмотрите на кодировку параметров Alamofire , они берут URLQueryAllowedCharacterSet, а затем удаляют generalDelimitersToEncode (который включает символы #, [, ] и @, но из-за исторической ошибки на некоторых старых веб-серверах ни ?, ни /) и subDelimitersToEncode (т.е. !, $, &, ', (, ), *, +, ,, ; и =). Это правильная реализация (хотя вы могли бы обсудить удаление ? и /), хотя и довольно запутанный. Возможно, CFURLCreateStringByAddingPercentEscapes более прямой/эффективный.
Ответ 4
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]];
Ответ 5
Приведенный выше код кода действительно полезен для меня (как было намечено выше), я думаю, вам нужно использовать NSMutableURLRequest, а не NSURLRequest. В его нынешнем виде я не мог заставить его ответить на вызов setHTTPMethod. Изменение типа фиксированных вещей прямо.
Ответ 6
Любой, кто ищет быстрое решение
let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)