使用sharedApplication openURL方法在Safari中打开使用POST方法托管的URL。
使用sharedApplication openURL方法在Safari中打开使用POST方法托管的URL。
我有一个情况,在模拟器中使用POST方法在Safari浏览器中托管一个URL。\n在启动我的iOS应用程序之后,网页会在Safari中打开。为了启动Safari,我使用了[[UIApplication sharedApplication] openURL: ...]\nPOST方法如下所示:\n
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***某个客户端URL***.jsp"]]; NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", userName, password]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:postData]; NSURLConnection* _urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [_urlConnection start];
\n当使用UIWebView时,这段代码工作正常。但是我想使用带有POST方法附加的用户名和密码数据的“request”来启动Safari。\n要启动Safari,我必须调用这段代码:\n
[[UIApplication sharedApplication] openURL:request];
\n但是这显然会引发一个警告,因为“request”是NSMutableURLRequest类型。\n“语义问题:将\'incompatible pointer types sending \'NSMutableURLRequest *\' to the parameter of type \'NSURL *”...\n我甚至不能使用[[UIApplication sharedApplication] openURL:request.URL];
,因为这会给我一个没有附加用户名和密码的URL(没有POST方法)。\n我想知道如何对此请求(NSMutableURLRequest)进行类型转换/转换,以便我可以将其放入[[UIApplication sharedApplication] openURL...中。\n希望我的问题非常清楚。非常感谢您的帮助!
问题原因:在使用sharedApplication openURL方法打开Safari时,无法通过该方法传递POST数据。
解决方法:使用自己的UIWebView在应用程序内部打开网址,并通过POST方法传递数据。具体代码如下:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://***some client url***.jsp"]]; NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", userName, password]; NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:postData]; [myUIWebView loadRequest:request];
问题的出现原因是:推荐的方法是在应用程序中使用UIWebView,并使用NSURLRequest和NSURLConnection创建POST请求。这种方法很容易创建一个POST请求并发送请求。但如果不想使用这种方法,唯一的替代方法是创建一个临时的HTML文件来实现。
问题的解决方法有两种:
1. 创建一个临时的HTML文件,并在其中编写一个onLoad()的JavaScript函数,该函数立即发送POST请求,并为禁用JavaScript的用户提供一个按钮。可以使用[NSURL fileURLWithPath:path]方法从该文件创建NSURL对象。
2. 从Web服务器创建一个一次性密钥,并通过HTTPS请求将其传递给Safari,具体方法在这里有提到。