Як ви додаєте дані до існуючих 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)