Wie hängen Sie Daten an eine vorhandene an POST
NSURLRequest
? Ich muss einen neuen Parameter hinzufügen userId=2323
.
Antworten:
Wenn Sie keine Klassen von Drittanbietern verwenden möchten, legen Sie den Post-Body wie folgt fest ...
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];
Hängen Sie einfach Ihr Schlüssel / Wert-Paar an die Post-Zeichenfolge an
Alle Änderungen an NSMutableURLRequest
müssen vor dem Anruf vorgenommen werden NSURLConnection
.
Ich sehe dieses Problem, wenn ich den obigen Code kopiere und einfüge TCPMon
und die Anforderung GET
anstelle der erwarteten ausführe 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];
Die vorherigen Beiträge zum Erstellen von POST
Anforderungen sind weitgehend korrekt (fügen Sie die Parameter dem Textkörper und nicht der URL hinzu). Wenn jedoch die Möglichkeit besteht, dass die Eingabedaten reservierte Zeichen enthalten (z. B. Leerzeichen, kaufmännisches Und und Vorzeichen), sollten Sie diese reservierten Zeichen verarbeiten. Sie sollten nämlich der Eingabe prozentual entkommen.
//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];
Wo die precentEscapeString
Methode wie folgt definiert ist:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Beachten Sie, dass es eine vielversprechende NSString
Methode gab stringByAddingPercentEscapesUsingEncoding
(die jetzt veraltet ist), die etwas sehr Ähnliches tut, aber der Versuchung widersteht, diese zu verwenden. Es behandelt einige Zeichen (z. B. das Leerzeichen), aber nicht einige der anderen (z. B. +
oder &
Zeichen).
Das zeitgenössische Äquivalent ist stringByAddingPercentEncodingWithAllowedCharacters
, aber auch hier nicht versucht zu sein URLQueryAllowedCharacterSet
, da dies auch erlaubt +
und &
ungehindert passieren kann. Diese beiden Zeichen sind in der umfassenderen "Abfrage" zulässig. Wenn diese Zeichen jedoch in einem Wert in einer Abfrage enthalten sind, müssen sie maskiert werden. Technisch können Sie entweder verwendenURLQueryAllowedCharacterSet
einen veränderlichen Zeichensatz erstellen und einige der darin enthaltenen Zeichen entfernen oder Ihren eigenen Zeichensatz von Grund auf neu erstellen.
Zum Beispiel, wenn Sie bei Alamofire der aussehen Parametercodierung , nehmen sie URLQueryAllowedCharacterSet
und entfernen generalDelimitersToEncode
(die die Zeichen enthält #
, [
, ]
, und @
, aber wegen eines historischen Fehler in einigen alten Web - Server, weder ?
noch /
) und subDelimitersToEncode
(dh !
, $
, &
, '
, (
, )
, *
, +
, ,
, ;
, und =
). Dies ist eine korrekte Implementierung (obwohl Sie über das Entfernen von ?
und diskutieren könnten /
), obwohl sie ziemlich kompliziert ist. Vielleicht CFURLCreateStringByAddingPercentEscapes
ist direkter / effizienter.
stringByAddingPercentEscapesUsingEncoding:
, stringByAddingPercentEncodingWithAllowedCharacters:
funktioniert aber gut mit jedem Charakter. Beispiel: URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
, aber Sie können nicht verwenden URLQueryAllowedCharacterSet
, da dies +
und &
(diese sind zulässige Zeichen in der breiteren Abfrage, aber wenn diese Zeichen in einem Wert innerhalb einer Abfrage erscheinen, müssen sie maskiert werden, was dieser Zeichensatz nicht tut ). Sie können also entweder URLQueryAllowedCharacterSet
einen veränderlichen Zeichensatz erstellen und einige der darin enthaltenen Zeichen entfernen oder Ihren eigenen Zeichensatz von Grund auf neu erstellen. Oder verwenden CFURLCreateStringByAddingPercentEscapes
.
CFURLCreateStringByAddingPercentEscapes
jetzt veraltet ist, sollten Sie den entsprechenden Zeichensatz wirklich selbst erstellen. Siehe 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]];
Der obige Beispielcode war für mich sehr hilfreich, aber (wie oben angedeutet), ich denke, Sie müssen ihn NSMutableURLRequest
eher verwenden als NSURLRequest
. In der aktuellen Form konnte ich es nicht dazu bringen, auf den setHTTPMethod
Anruf zu antworten . Durch Ändern des Typs wurden die Probleme behoben.
Jeder, der nach einer schnellen Lösung sucht
let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)