Jak dołączyć dane do istniejącego POST
NSURLRequest
? Muszę dodać nowy parametr userId=2323
.
Odpowiedzi:
Jeśli nie chcesz korzystać z klas innych firm, możesz ustawić treść posta w następujący sposób ...
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];
Po prostu dołącz swoją parę klucz / wartość do ciągu postu
Wszystkie zmiany w NSMutableURLRequest
domenie należy wprowadzić przed wywołaniemNSURLConnection
.
Widzę ten problem, gdy kopiuję i wklejam powyższy kod, uruchamiam TCPMon
i widzę, że żądanie jest GET
zamiast oczekiwanego 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];
Poprzednie posty dotyczące POST
żądań formowania są w dużej mierze poprawne (dodaj parametry do treści, a nie do adresu URL). Ale jeśli jest jakaś szansa, że dane wejściowe zawierają jakiekolwiek zastrzeżone znaki (np. Spacje, ampersand, znak plus), wtedy będziesz chciał obsłużyć te zastrzeżone znaki. Mianowicie, powinieneś procentowo zmienić dane wejściowe.
//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];
Gdzie precentEscapeString
metoda jest zdefiniowana w następujący sposób:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Zauważ, że była obiecująca NSString
metoda stringByAddingPercentEscapesUsingEncoding
(obecnie przestarzała), która robi coś bardzo podobnego, ale opiera się pokusie jej użycia. Obsługuje niektóre znaki (np. Znak spacji), ale nie niektóre inne (np. Znaki +
lub &
).
Współczesny odpowiednik jest stringByAddingPercentEncodingWithAllowedCharacters
, ale znowu nie być skłonny do użytku URLQueryAllowedCharacterSet
, jak również pozwala +
i &
przekazać Niecytowany. Te dwa znaki są dozwolone w ramach szerszego „zapytania”, ale jeśli te znaki pojawiają się w wartości w zapytaniu, muszą zostać zmienione. Technicznie możesz użyćURLQueryAllowedCharacterSet
do zbudowania zmiennego zestawu znaków i usunąć kilka postaci, które tam umieścili, lub zbudować własny zestaw znaków od podstaw.
Na przykład, jeśli spojrzeć na Alamofire za kodowanie parametrów , biorą URLQueryAllowedCharacterSet
, a następnie usunąć generalDelimitersToEncode
(który zawiera znaki #
, [
, ]
, i @
, ale z powodu historycznego błędu w niektórych starych serwerów WWW, ani ?
też nie /
) i subDelimitersToEncode
(czyli !
, $
, &
, '
, (
, )
, *
, +
, ,
, ;
, i =
). Jest to poprawna implementacja (choć można debatować nad usunięciem ?
i /
), chociaż dość zawiła. Być może CFURLCreateStringByAddingPercentEscapes
jest bardziej bezpośredni / skuteczny.
stringByAddingPercentEscapesUsingEncoding:
, ale stringByAddingPercentEncodingWithAllowedCharacters:
działa dobrze z każdą postacią. Przykład: URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
, ale nie możesz używać URLQueryAllowedCharacterSet
, ponieważ obejmuje to +
i &
(są to dozwolone znaki w ramach szerszego zapytania, ale jeśli te znaki pojawiają się w wartości w zapytaniu, muszą być chronione przed ucieczką, czego ten zestaw znaków nie zrobi ). Możesz więc użyć URLQueryAllowedCharacterSet
do zbudowania zmiennego zestawu znaków i usunąć kilka znaków, które tam umieścili, lub zbudować własny zestaw znaków od podstaw. Lub użyj CFURLCreateStringByAddingPercentEscapes
.
CFURLCreateStringByAddingPercentEscapes
jest to przestarzałe, naprawdę powinieneś sam zbudować odpowiedni zestaw znaków. Zobacz 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]];
Powyższy przykładowy kod był dla mnie bardzo pomocny, jednak (jak wskazano powyżej), myślę, że powinieneś NSMutableURLRequest
raczej użyć niż NSURLRequest
. W obecnej formie nie mogłem go zmusić do odpowiedzi na setHTTPMethod
wezwanie. Zmiana typu naprawiła rzeczy.
Każdy, kto szuka szybkiego rozwiązania
let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)