26

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

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

4

4 回答 4

13

使用网络视图:

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);
于 2011-04-04T18:29:13.597 回答
3

Intents sent to the browser can contain more than just a URL. In older versions of android it was possible to package extra POST data in the intent, in newer versions that capability is gone but one can send extra header data for a GET (which can be just about anything representable as a string) in the intent delivered to the browser.

于 2010-11-08T06:25:26.413 回答
3
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());
    }
于 2016-09-16T17:19:34.300 回答
0

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

如果你承认我会做一些在这种情况下可能很常见的假设:

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

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

如果这是真的,那么使用一些 OKHttp、HTTPURLConnection、Apache HTTP 客户端等是正确的选择。而不是通过 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 方服务器交互可能会产生一些法律影响。事实上,这些服务器可能不允许通过浏览器进行其他用途(人工检测 = 验证码,用户代理检测)。在这种情况下,您必须与服务器所有者协商。

于 2015-06-12T14:20:19.703 回答