我怎样才能打开Android浏览器指定的POST参数?
我的应用程序,我需要在Android浏览器中打开一个链接。 这个页面只能通过POST获得一些数据。 我可以将这些参数(数据)添加到启动浏览器的意图吗?
你知道这是可能的吗? 如果是的话,你能给我一个提示吗?
使用webview:
WebView webview = new WebView(this); setContentView(webview); byte[] post = EncodingUtils.getBytes("postvariable=value&nextvar=value2", "BASE64"); webview.postUrl("http://www.geenie.nl/AnHeli/mobile/ranking/demo/index.php", post);
try{ String finalUrl = "javascript:" + "var to = 'http://the_link_you_want_to_open';" + "var p = {param1:'"+your_param+"',param2:'"+your_param+"'};" + "var myForm = document.createElement('form');" + "myForm.method='post' ;" + "myForm.action = to;" + "for (var k in p) {" + "var myInput = document.createElement('input') ;" + "myInput.setAttribute('type', 'text');" + "myInput.setAttribute('name', k) ;" + "myInput.setAttribute('value', p[k]);" + "myForm.appendChild(myInput) ;" + "}" + "document.body.appendChild(myForm) ;" + "myForm.submit() ;" + "document.body.removeChild(myForm) ;"; Uri uriUrl = Uri.parse(finalUrl); Intent browserIntent = new Intent(Intent.ACTION_VIEW); PackageManager packageManager = this.getPackageManager(); browserIntent.setData(uriUrl); List<ResolveInfo> list = packageManager.queryIntentActivities(browserIntent, 0); for (ResolveInfo resolveInfo : list) { String activityName = resolveInfo.activityInfo.name; if (activityName.contains("BrowserActivity")) { browserIntent = packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName); ComponentName comp = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name); browserIntent.setAction(Intent.ACTION_VIEW); browserIntent.addCategory(Intent.CATEGORY_BROWSABLE); browserIntent.setComponent(comp); browserIntent.setData(uriUrl); } } this.startActivity(browserIntent); }catch (Exception e){ e.printStackTrace(); txtHeader.setText(e.toString()); }
发送到浏览器的意向可以包含不止一个URL。 在老版本的android中,可以在意图中打包额外的POST数据,在较新的版本中,能力已经消失,但是可以在意图传送的情况下发送额外的头部数据(可以是任何可表示为string的东西)到浏览器。
我相信这个问题有一点误解。 缺less的是你需要POST而不是GET的目的 。
如果你承认我会在这方面做一些常见的假设:
- 您需要隐藏历史中的实际variables
- 在用户获得控制之前,需要与服务器进行一些交互
- 你不能控制服务器本身,它使用(有意)的POST请求
这些选项或要求中的任何一个都意味着一些额外的处理,这与通常的浏览器用例不同(这是为了完全控制处理和交互)。 看来,你实际上是要求机器到机器(M2M)通信与最终的HTML输出。
如果呈现为true,那么使用一些OKHttp,HTTPURLConnection,Apache HTTP Client等是正确的select。 而不是通过意向调用浏览器,接近零消息传递function(只是消防和遗忘 – 的情况下http:…)。 它实际上需要对数据stream进行一些分析(顺序图可能有所帮助),然后将该过程devise成M2M或辅助M2M交互。
如果您正在使用的服务器是您自己的,那么为什么不创build一些REST / JSON / SOAP或其他M2M API来进行远程方法调用(RPC / RMI / …)。 它看起来并不那么复杂(例如: http : //coreymaynard.com/blog/creating-a-restful-api-with-php/或https://docs.phalconphp.com/pt/latest/reference /tutorial-rest.html )
另一种方法是在您的APP服务器上进行M2M交互,因为这样BE服务器数据stream的最终更改就可以反映出来,而无需更改应用程序。 由此,您实际上将M2M通信部分地转移到服务器端。
注意:使用应用程序与第三方服务器交互可能会有一些法律影响。 实际上这些服务器可能不允许通过浏览器进行其他用途(人工检测=validation码,用户代理检测)。 在这种情况下,您必须与服务器所有者协商。