Подтвердить что ты не робот

Как открыть браузер Android с указанными параметрами POST?

Мне мое приложение, мне нужно открыть ссылку в Android-браузере. Эта страница может получать некоторые данные только через POST. Могу ли я добавить эти параметры (данные) в намерение, которое запустит браузер?

Знаете ли вы, возможно ли это? Если да, не могли бы вы дать мне подсказку?

4b9b3361

Ответ 1

Используйте веб-просмотр:

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

Ответ 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

Усилия, отправленные в браузер, могут содержать не только URL-адрес. В более ранних версиях android можно было добавить дополнительные POST-данные в намерение, в более новых версиях эта возможность исчезла, но можно отправить дополнительные данные заголовка для GET (что может быть почти что угодно, представляемое в виде строки) в намерении доставлено в браузер.

Ответ 4

Я считаю, что в вопросе есть небольшое заблуждение. Отсутствует цель, необходимая для POST вместо GET.

Если вы согласитесь, я сделаю несколько предположений, которые могут быть распространены в этом контексте:

  • Вам нужно скрыть фактические переменные из истории
  • Вам нужно некоторое взаимодействие с сервером до того, как пользователь получит контроль.
  • Вы не можете управлять самим сервером и использовать (специально) POST запросы

Любая из этих опций или требований подразумевает некоторую дополнительную обработку, отличную от обычного варианта использования браузера (который должен полностью контролировать обработку и взаимодействие). Кажется, что вы действительно запрашиваете связь Machine to Machine (M2M) с возможным выходом HTML.

Если это правда, то использование некоторых OKHttp, HTTPURLConnection, Apache HTTP Client и т.д. является правильным выбором. Вместо этого вызывается браузер через Intent, который имеет почти нулевые возможности обмена сообщениями (просто стреляйте и забудьте - в случае http:...). Это на самом деле требует некоторого анализа потока данных (может помочь диаграмма последовательности), а затем проектирования этого процесса в M2M или при помощи M2M-взаимодействия.

Если сервер, с которым вы работаете для взаимодействия, является вашим собственным, то почему вы не создаете REST/JSON/SOAP или другой API M2M для выполнения удаленных вызовов методов (RPC/RMI/...). Это не так сложно, как могло бы выглядеть (например: http://coreymaynard.com/blog/creating-a-restful-api-with-php/ или https://docs.phalconphp.com/pt/latest/reference/tutorial-rest.html)

Альтернативой было бы сделать ваше взаимодействие M2M скорее на вашем сервере APP, потому что тогда возможные изменения потока данных сервера BE могли бы отражаться без изменения приложения. Таким образом, вы фактически переместили бы связь M2M на серверную сторону.

Примечание. Использование приложения для взаимодействия с сторонними серверами может иметь некоторые юридические последствия. Фактически, этот сервер может не допускать другого использования, кроме как через браузер (обнаружение человека = captcha, обнаружение User-Agent). В этом случае вам необходимо договориться с владельцем сервера.