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

时间:2010-11-07 21:36:15

标签: android android-intent android-sdk-2.1

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

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

4 个答案:

答案 0 :(得分:11)

使用网络视图:

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

答案 1 :(得分:3)

发送到浏览器的意图不仅包含URL。在较旧版本的android中,可以在intent中打包额外的POST数据,在较新的版本中,功能消失但是可以在意图传递的GET中发送额外的头数据(可以是任何可表示为字符串的任何东西)到浏览器。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我认为这个问题存在一些误解。缺少的是您需要 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通信部分转移到服务器端。

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