【问题标题】:Open Url hosted using POST method in Safari using sharedApplication openURL method在 Safari 中使用 sharedApplication openURL 方法打开使用 POST 方法托管的 URL
【发布时间】:2012-10-23 04:03:07
【问题描述】:

我有一种情况,我使用 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...

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

【问题讨论】:

    标签: iphone objective-c ios xcode uiapplication


    【解决方案1】:

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

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

    另一种解决方案是从网络服务器创建一个one time key,并通过HTTPS 请求as mentioned here 将其传递给safari。

    【讨论】:

      【解决方案2】:

      通过 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];
      

      【讨论】:

        【解决方案3】:

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

        希望我清楚。

        【讨论】:

        • 这是正确的,openURL 仅将 URL 作为参数,因此无法附加您在请求中放置的额外数据
        • @iCreative:它是一个 URL 请求,我正在向其中添加 POST 方法,以便登录后用户名和密码在 URL 中不可见。这不是用户身份验证,它用于数据编码。我想知道如何从“[[UIApplication sharedApplication] openURL:”中调用 NSMutableURLRequest 变量......希望我很清楚。
        • 我想告诉你,你只能使用 OpenURL 方法打开 URL。就像您在浏览器中打开 google.com 并使用您的应用程序打开它并调用 safari 浏览器打开“google.com”一样。它没有在请求正文中传递任何类型的参数...希望我很清楚。
        • UIApp::openURL 只执行“GET 请求”,无论您设置什么! :) 尝试@foggzilla 的解决方案或重新考虑您的解决方案是否可行
        • 无法做到。正如其他人所提到的,您无法通过openURL 发出 POST 请求,就像在浏览器的地址栏中键入一个请求一样。 @ACB 的“临时网页”解决方案很聪明,坦率地说,这是我能想到的唯一方法。然而,即便如此,它也会带来非常糟糕的用户体验,我更倾向于采用采用UIWebView 方法的所提供的解决方案。
        猜你喜欢
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        相关资源
        最近更新 更多