繁体   English   中英

如何使用指定的 POST 参数打开 Android 浏览器?

[英]How can I open Android browser with specified POST parameters?

我的应用程序,我需要在 Android 浏览器中打开一个链接。 该页面可以仅通过 POST 接收一些数据。 我可以将这些参数(数据)添加到启动浏览器的意图中吗?

你知道这是否可能? 如果是的话,你能给我一个提示吗?

使用网络视图:

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());
    }

发送到浏览器的 Intent 可以包含的不仅仅是一个 URL。 在旧版本的 android 中,可以在 Intent 中打包额外的 POST 数据,在较新的版本中,该功能已消失,但可以在传递的 Intent 中为 GET(可以是任何可表示为字符串的任何内容)发送额外的标头数据到浏览器。

我相信这个问题存在一些误解。 缺少的是您需要POST而不是GET 的目的

如果您承认,我将做出一些在这种情况下可能常见的假设:

  • 您需要从历史记录中隐藏实际变量
  • 在用户获得控制权之前,您需要与服务器进行一些交互
  • 您无法控制服务器本身,它使用(故意) POST请求

这些选项或要求中的任何一个都意味着一些不同于通常浏览器用例的额外处理(即完全控制处理和交互)。 看来您实际上是在要求与最终 HTML 输出进行机器对机器 (M2M) 通信。

如果这是真的,那么使用一些 OKHttp、HTTPURLConnection、Apache HTTP Client 等是正确的选择。 而不是通过 Intent 调用浏览器,它具有接近零的消息传递功能(只是触发和忘记 - 在 http:... 的情况下)。 它实际上需要对数据流进行一些分析(序列图可能会有所帮助),然后将该过程设计为 M2M 或辅助 M2M 交互。

如果您用来交互的服务器是您自己的,那么为什么不创建一些 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 服务器数据流的最终更改。 通过这种方式,您实际上会将 M2M 通信部分转移到服务器端。

注意:使用应用程序与 3rd 方服务器交互可能会产生一些法律影响。 事实上,除了通过浏览器(人体检测 = 验证码,用户代理检测),这些服务器可能不允许其他用途。 在这种情况下,您必须与服务器所有者协商。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM