用特殊字符iOS发送POST请求

我的应用程序调用Web服务来login。 通常服务没有任何问题,但是当我有一个特殊字符的密码(例如:!*'\“();:@&= + $,/?%#[]%)时,Web服务器不会不允许我login,因为在服务器端我收到没有特殊字符的密码,例如:

密码插入我的应用程序: test+test

密码接收到Web服务器: testtest

正如你所看到的请求通过使用下面的代码删除实际上我发送login凭据的特殊字符:

 - (id)sendRequestToURL:(NSString *)url withMethod:(NSString *)method withUsername:(NSString*)username withPassword:(NSString*)password andInstallationId:(NSString*)installationId { NSURL *finalURL = [[NSURL alloc]init]; if ([method isEqualToString:@"POST"]) { finalURL = [NSURL URLWithString:url]; } else { NSLog(@"Metodo no previsto"); } NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", username, password, installationId]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)postData.length]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; [request setURL:finalURL]; [request setHTTPMethod:method]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; if (connection) { [connection start]; } return connection; } 

我如何解决这个问题? 我看了NSString类的引用 ,我看到有方法- stringByAddingPercentEncodingWithAllowedCharacters:不删除特殊字符,没有人知道如何使用这个方法吗? 你能给我看一个代码片段吗?

谢谢

我find了解决这个问题的方法,下面是我的代码,也许应该对某人有用:

 - (id)sendRequestToURL:(NSString *)url withMethod:(NSString *)method withUsername:(NSString*)username withPassword:(NSString*)password andInstallationId:(NSString*)installationId { NSURL *finalURL = [[NSURL alloc]init]; if ([method isEqualToString:@"POST"]) { finalURL = [NSURL URLWithString:url]; } else { NSLog(@"Metodo no previsto"); } NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ0123456789"]; NSString *encodedPassword = [password stringByAddingPercentEncodingWithAllowedCharacters:set]; NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", username, encodedPassword, installationId]; NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)postData.length]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; [request setURL:finalURL]; [request setHTTPMethod:method]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; if (connection) { [connection start]; } return connection; } 

通过这种方式,我在密码string中search特殊字符,如果发现它使用百分号编码更改此字符。 这样我就可以用简单的密码和特殊字符的密码login。 我希望这对某个人有用。

只需使用- stringByAddingPercentEscapesUsingEncoding:编码每个参数。

 NSString *encodeUsername = [username stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *encodePassword = [password stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *encodeInstallationId = [installationId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *post = [NSString stringWithFormat:@"username=%@&password=%@&installationId=%@", encodeUsername, encodePassword, ins encodeInstallationId allationId]; 

在你的请求中使用这个编码参数。

Url将您的string进行编码并POST到Web服务。 请使用下面的方法进行url编码。

 +(NSString *) urlencode: (NSString *) str { NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes( NULL, (CFStringRef)str, NULL, (CFStringRef)@" ", kCFStringEncodingUTF8 ); return [encodedString autorelease]; 

}