如何将数据附加到现有的POST
NSURLRequest
?我需要添加一个新参数userId=2323
。
发布于 2011-05-27 15:20:28
如果你不想使用第三方类,那么下面是如何设置帖子主体的……
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字符串
发布于 2012-12-31 15:23:38
在调用NSURLConnection
之前,必须对NSMutableURLRequest
进行所有更改。
当我复制并粘贴上面的代码并运行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];
发布于 2014-03-29 08:46:13
前面关于形成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
,因为它也允许+
和&
传递不转义。这两个字符在更广泛的" query“中是允许的,但如果这两个字符出现在查询中的值中,则必须对它们进行转义。从技术上讲,您可以使用URLQueryAllowedCharacterSet
构建一个可变字符集并删除其中包含的一些字符,也可以从头开始构建您自己的字符集。
例如,如果您查看Alamofire的parameter encoding,它们会获取URLQueryAllowedCharacterSet
,然后删除generalDelimitersToEncode
(其中包含字符#
、[
、]
和@
,但由于某些旧web服务器中的历史错误,?
和/
都不存在)和D22(即D23、D24、D25、D26、D27、D28、D29、D30、D31、D32和=
)。这是正确的实现(尽管您可能会争论删除?
和/
的问题),尽管相当复杂。也许CFURLCreateStringByAddingPercentEscapes
更直接、更高效。
https://stackoverflow.com/questions/6148900
复制相似问题