将数据附加到POST NSURLRequest

时间:2011-05-27 07:01:34

标签: ios objective-c nsurlrequest

如何将数据附加到现有POST NSURLRequest?我需要添加一个新参数userId=2323

6 个答案:

答案 0 :(得分:190)

如果您不想使用第三方课程,那么以下是您设置帖子正文的方式......

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];

只需将您的键/值对附加到帖子字符串

即可

答案 1 :(得分:16)

必须在致电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];

答案 2 :(得分:11)

以前关于形成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的parameter encoding,他们会URLQueryAllowedCharacterSet,然后移除generalDelimitersToEncode(其中包含字符#,{{1 }},[],但由于某些旧网络服务器中存在历史错误,@?}和/(即{ {1}},subDelimitersToEncode!$&'(),{{1 },*+)。这是正确的实现(尽管你可以讨论删除,;),尽管很复杂。也许=更直接/更有效率。

答案 3 :(得分:8)

 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]];

答案 4 :(得分:8)

上面的示例代码对我很有帮助(但正如上面所暗示的那样),我认为您需要使用NSMutableURLRequest而不是NSURLRequest。在目前的形式中,我无法回复setHTTPMethod电话。改变类型固定的东西。

答案 5 :(得分:1)

任何人都在寻找快速解决方案

let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)