9

我有一种情况,我使用 POST 方法在模拟器的 safari 浏览器中托管 URL。在模拟器中启动我的 iOS 应用程序后,该网页在 safari 中打开。为了启动 safari,我使用了 [[UIApplication sharedApplication] openURL: ...

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


NSURLConnection* _urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_urlConnection start];

这段代码在使用 UIWebView 时可以正常工作。但我想使用这个“请求”启动 Safari,该“请求”从 POST 方法中附加了用户名和密码数据。

要启动 Safari,我必须调用此代码:

[[UIApplication sharedApplication] openURL:request];

但这显然会引发警告,因为“请求”是 NSMutableURLRequest 类型。“语义问题:不兼容的指针类型将“NSMutableURLRequest *”发送到“NSURL *”类型的参数...

我什至不能使用[[UIApplication sharedApplication] openURL:request.URL];,因为这会给我一个没有附加用户名和密码的 URL(没有 POST 方法)。

我想知道如何对这个请求进行类型转换/转换(NSMutableURLRequest),以便我可以在 [[UIApplication sharedApplication] openURL ...

希望我对我的问题很清楚。任何帮助将不胜感激。提前致谢 !!

4

3 回答 3

5

推荐的方法是在您的应用程序中使用并使用和UIWebView创建发布请求。创建发布请求并触发请求非常容易。由于您已经弄清楚了这一点并且您不想使用这种方法,因此唯一的替代方法是创建一个临时 html 文件,如此处所述。您可以尝试他们遵循的方法,并检查它是否适用于您的情况。NSURLRequestNSURLConnection

根据该链接,您必须编写一个临时 html 文件。这个 html 文件将有一个onLoad()javascript 立即发送 POST,以及一个用于未启用 javascript 的用户的按钮。您可以从此文件创建NSURL对象。[NSURL fileURLWithPath:path];

另一种解决方案是从网络服务器创建一次性密钥,并通过 HTTPS 请求将其传递给 safari,如此处所述

于 2012-11-11T10:36:50.687 回答
3

通过 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];
于 2012-11-08T22:11:45.973 回答
2

在将数据添加到正文中时,您无法从浏览器发出 POST 请求。如果是 URL 请求,您可以在请求的标头中添加身份验证作为参数,您可以在 safari 中打开该 URL。

希望我很清楚。

于 2012-11-02T13:40:29.560 回答