2010-11-07 30 views
21

J'ai mon application, j'ai besoin d'ouvrir un lien dans le navigateur Android. Cette page peut recevoir des données uniquement via POST. Puis-je ajouter ces paramètres (données) à l'intention qui démarre le navigateur?Comment puis-je ouvrir le navigateur Android avec les paramètres POST spécifiés?

Savez-vous si c'est possible? Si c'est le cas, pourriez-vous me donner un indice?

+0

> Puis-je ajouter ces paramètres (données) à l'intention qui lance le navigateur? POSTER? GET? Oui. – CommonsWare

+0

Merci.Il n'y a donc aucun moyen d'envoyer des données via POST à ​​une page et de l'ouvrir dans le navigateur Android? Même si j'utilise WebView? –

+0

Correct. Tout comme vous ne pouvez pas "certaines données via POST à ​​une page" n'importe où ailleurs en utilisant une URL simple (par exemple, un lien hypertexte dans la page Web). Ce n'est pas une chose Android - c'est une chose Internet. – CommonsWare

Répondre

3

Les intentions envoyées au navigateur peuvent contenir plus qu'une simple URL. Dans les anciennes versions d'android, il était possible d'empaqueter des données POST supplémentaires dans l'intention, dans des versions plus récentes, cette capacité est supprimée mais on peut envoyer des données d'en-tête supplémentaires pour un GET (qui peut être à peu près tout comme une chaîne). au navigateur.

+0

Bien sûr, ce qui est pris en charge dépend finalement de l'application de navigateur reçoit l'intention. –

11

Utilisez un 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); 
+0

comment pourrais-je envoyer une charge utile JSON? – user1796624

0

Je crois qu'il ya un peu de malentendu dans la question. Ce qui manque est le but que vous avez besoin du POST au lieu de GET.

Si vous admettez que je vais faire quelques hypothèses qui pourraient être communs dans ce contexte:

  • Vous devez cacher les variables réelles de l'histoire
  • vous avez besoin d'interaction avec le serveur avant l'utilisateur obtient le contrôle
  • Vous ne pouvez pas contrôler le serveur lui-même et il utilise (sur le but) POST demande

de ces options, ou les exigences impliquent un traitement supplémentaire qui est distinct du cas d'utilisation habituel du navigateur (qui consiste à donner un contrôle total sur le traitement et l'interaction). Il semble que vous demandiez réellement une communication Machine to Machine (M2M) avec une sortie HTML éventuelle.

Si cela s'avère être vrai, alors utiliser OKHttp, HTTPURLConnection, Apache HTTP Client, etc. est le bon choix. Plutôt que d'invoquer le navigateur via Intent, cela a des capacités de messagerie proches de zéro (il suffit de tirer et d'oublier - dans le cas de http: ...). Cela nécessite en fait une analyse du flux de données (un diagramme de séquence pourrait aider), puis l'ingénierie de ce processus en interaction M2M ou M2M assistée. Si le serveur avec lequel vous interagissez est le vôtre, pourquoi ne créez-vous pas un REST/JSON/SOAP ou une autre API M2M pour effectuer des appels de méthode à distance (RPC/RMI/...). L'alternative serait de rendre votre interaction M2M plutôt sur votre serveur APP, car alors les changements éventuels au flux de données du serveur BE pourraient être reflétés sans application. changement. Par là, vous déplaceriez la communication M2M partiellement vers le côté serveur.

Remarque: L'utilisation d'une application pour interagir avec des serveurs tiers peut avoir des implications juridiques. En fait, ces serveurs pourraient ne pas permettre d'autres utilisations que via le navigateur (détection humaine = captcha, détection User-Agent). Dans ce cas, vous devez négocier avec le propriétaire du serveur.

+0

La principale raison pour laquelle vous pouvez utiliser * POST * est lorsque la requête n'est pas idempotente, mais qu'elle change quelque chose. – Flimm

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