2010-11-07 10 views
21

I la mia applicazione, ho bisogno di aprire un collegamento nel browser Android. Questa pagina può ricevere alcuni dati solo tramite POST. Posso aggiungere questi parametri (dati) all'intento che avvia il browser?Come posso aprire il browser Android con i parametri POST specificati?

Sai se questo è possibile? Se lo è, potresti darmi un suggerimento?

+0

> Posso aggiungere questi parametri (dati) all'intenzione che avvia il browser? INVIARE? No. OTTENERE? Sì. – CommonsWare

+0

Grazie.Quindi non è possibile inviare alcuni dati tramite POST a una pagina e aprirli nel browser Android? Anche se utilizzo WebView? –

+0

corretto. Proprio come non è possibile "alcuni dati via POST a una pagina" in nessun altro luogo utilizzando un semplice URL (ad es. Collegamento ipertestuale nella pagina Web). Questa non è una cosa di Android - è una cosa di Internet. – CommonsWare

risposta

3

Gli intenti inviati al browser possono contenere più di un semplice URL. Nelle versioni precedenti di Android era possibile inserire ulteriori dati POST nell'intento, nelle versioni più recenti questa funzionalità è scomparsa, ma si possono inviare dati di intestazione aggiuntivi per un GET (che può essere qualsiasi cosa rappresentabile come stringa) nell'intento consegnato al browser.

+0

Ovviamente, ciò che è supportato in definitiva dipende da quale app Browser sta ricevendo l'Intento. –

11

Utilizzare una 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

come potrei inviare un carico utile JSON? – user1796624

0

Credo che ci sia un po 'equivoco nella questione. Quello che manca è lo scopo che è necessario del POST anziché GET.

Se si ammette Farò poche assunzioni che potrebbero essere comuni in questo contesto:

  • hai bisogno di nascondere le variabili reali dalla storia
  • che c'è qualche interazione con il server prima che l'utente ottiene il controllo
  • non si può controllare il server stesso e utilizza (di proposito) POST richiede

qualsiasi di queste opzioni o i requisiti implicano un'ulteriore elaborazione distinta dal solito caso d'uso del browser (che è quello di dare il pieno controllo sull'elaborazione e l'interazione). Sembra che tu stia effettivamente chiedendo una comunicazione Machine to Machine (M2M) con output HTML finale.

Se il rendering è true, utilizzare OKHttp, HTTPURLConnection, Apache HTTP Client, ecc. È la scelta giusta. Piuttosto che invocare il browser tramite Intent, che ha quasi zero capacità di messaggistica (basta accendere e dimenticare - in caso di http: ...). In realtà richiede alcune analisi del flusso di dati (il diagramma di sequenza potrebbe essere d'aiuto) e quindi l'ingegnerizzazione di tale processo in M2M o l'interazione M2M assistita.

Se il server con cui si interagisce è il proprio, perché non creare alcuni REST/JSON/SOAP o altre API M2M per effettuare chiamate a metodi remoti (RPC/RMI/...). Non è così complesso come potrebbe sembrare (ad esempio: http://coreymaynard.com/blog/creating-a-restful-api-with-php/ o https://docs.phalconphp.com/pt/latest/reference/tutorial-rest.html)

Alternativa sarebbe quella di rendere l'interazione M2M piuttosto sul tuo server APP, perché quindi le eventuali modifiche al flusso di dati del server BE potrebbero essere riflesse senza app modificare. In questo modo si sposta effettivamente la comunicazione M2M parzialmente sul lato server.

Nota: L'utilizzo dell'applicazione per interagire con server di terze parti potrebbe avere alcune implicazioni legali. In effetti, questi server potrebbero non consentire un utilizzo diverso da quello del browser (rilevamento umano = captcha, rilevamento utente-agente). In tal caso è necessario negoziare con il proprietario del server.

+0

Il motivo principale per cui è possibile utilizzare * POST * è quando la richiesta non è idempotente, ma cambia qualcosa. – 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()); 
    } 
Problemi correlati