2010-11-07 174 views
21

我的應用程序,我需要在Android瀏覽器中打開一個鏈接。這個頁面可以通過POST獲得一些數據。我可以將這些參數(數據)添加到啓動瀏覽器的意圖嗎?如何使用指定的POST參數打開android瀏覽器?

你知道這是可能嗎?如果是這樣,你能給我一個提示嗎?

+0

>我可以將這些參數(數據)添加到啓動瀏覽器的意圖嗎? POST?沒有GET?是。 – CommonsWare 2010-11-07 22:35:51

+0

謝謝。所以沒有辦法通過POST發送一些數據到頁面並在Android Browser中打開它?即使我使用WebView? – 2010-11-07 22:56:56

+0

正確。正如您無法使用普通URL(例如,網頁中的超鏈接)在其他任何地方「通過POST獲取某些數據」一樣。這不是Android的事情 - 這是互聯網的事情。 – CommonsWare 2010-11-07 23:05:21

回答

3

發送給瀏覽器的意向可以包含的不僅僅是一個URL。在早期版本的android中,可以在意圖中打包額外的POST數據,而在新版本中,功能已經消失,但可以在意向傳送中爲GET發送額外的頭數據(可以是任何可表示爲字符串的東西)到瀏覽器。

+0

中向POST請求添加參數。當然,支持的內容最終取決於哪個瀏覽器應用程序正在接收Intent。 – 2015-05-13 16:08:06

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

我將如何發送json有效載荷? – user1796624 2015-04-16 15:44:34

0

我認爲,在這個問題有點誤解。缺少的是你需要POST而不是GET的目的。

如果你承認,我會做一些假設,可能在這方面是共同的:

  • 你需要隱藏的歷史實際變量
  • 您需要用戶之前,服務器一定的相互作用得到控制
  • 你無法控制服務器本身和它使用的(故意)POST請求

任何的那些選項或需求意味着一些額外的處理與通常的瀏覽器用例不同(這是爲了完全控制處理和交互)。看起來你實際上是要求機器對機器(M2M)與最終的HTML輸出通信。

如果呈現爲true,則使用一些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

替代方法是使你的M2M互動,而不是你的應用服務器上,因爲那樣的話到BE服務器的數據流最終的變化可能不應用體現更改。由此你將實際上將M2M通信部分地轉移到服務器端。

注意:使用應用程序與第三方服務器進行交互可能會有一些法律影響。事實上,這些服務器可能不允許通過瀏覽器進行其他用途(人工檢測=驗證碼,用戶代理檢測)。在這種情況下,您必須與服務器所有者協商。

+0

您可能會使用* POST *的主要原因是請求不是冪等的,但會改變某些內容。 – Flimm 2016-07-21 14:29:43

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()); 
    } 
相關問題