Tim*_*Tim 82 objective-c nsurlrequest ios
如何将数据附加到现有数据POST
NSURLRequest
?我需要添加一个新参数userId=2323
.
Sim*_*Lee 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];
Run Code Online (Sandbox Code Playgroud)
只需将您的键/值对附加到帖子字符串即可
Kev*_*vin 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];
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 12
关于形成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];
Run Code Online (Sandbox Code Playgroud)
其中precentEscapeString
方法被定义如下:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Run Code Online (Sandbox Code Playgroud)
请注意,有一种很有前景的NSString
方法stringByAddingPercentEscapesUsingEncoding
(现已弃用),它做了非常相似的事情,但却抵制使用它的诱惑.它处理一些字符(例如空格字符),但不处理其他字符(例如字符+
或&
字符).
当代的等价物stringByAddingPercentEncodingWithAllowedCharacters
,但是,再次,不要试图使用URLQueryAllowedCharacterSet
,因为这也允许+
和&
传递未转义.这两个字符在更广泛的"查询"中是允许的,但如果这些字符出现在查询中的值内,则必须对其进行转义.从技术上讲,您可以使用URLQueryAllowedCharacterSet
构建可变字符集并删除它们中包含的一些字符,或者从头开始构建自己的字符集.
例如,如果你看一下Alamofire的参数编码,他们采取URLQueryAllowedCharacterSet
然后删除generalDelimitersToEncode
(包括文字#
,[
,]
,和@
,但由于在一些旧的web服务器一个历史错误,既不?
也没有/
)和subDelimitersToEncode
(即!
,$
,&
,'
,(
,)
,*
,+
,,
,;
,和=
).这是正确的实现(虽然你可以辩论删除?
和/
),虽然相当复杂.也许CFURLCreateStringByAddingPercentEscapes
更直接/更有效率.
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]];
Run Code Online (Sandbox Code Playgroud)
上面的示例代码对我来说真的很有帮助(但正如上面已经暗示的那样),我认为你需要使用NSMutableURLRequest
而不是NSURLRequest
.目前的形式,我无法回应这个setHTTPMethod
电话.改变类型固定的东西.