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 NSMutableURLRequestmüssen vor dem Anruf vorgenommen werden NSURLConnection.
Ich sehe dieses Problem, wenn ich den obigen Code kopiere und einfüge TCPMonund die Anforderung GETanstelle 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 POSTAnforderungen 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 precentEscapeStringMethode 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 NSStringMethode 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 URLQueryAllowedCharacterSetund 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 CFURLCreateStringByAddingPercentEscapesist 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 URLQueryAllowedCharacterSeteinen veränderlichen Zeichensatz erstellen und einige der darin enthaltenen Zeichen entfernen oder Ihren eigenen Zeichensatz von Grund auf neu erstellen. Oder verwenden CFURLCreateStringByAddingPercentEscapes.
CFURLCreateStringByAddingPercentEscapesjetzt 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 NSMutableURLRequesteher verwenden als NSURLRequest. In der aktuellen Form konnte ich es nicht dazu bringen, auf den setHTTPMethodAnruf 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)