Sending arguments via Android, php, and external java



這是一個AMP架構下(Apache, MySQL, php)與Android連接
經由Android傳遞數值經過php再到伺服器端執行java程式後再返回Android的架構

傳遞數值的關鍵步驟大概如下面所列出:
  1. (Android)以EditText取得使用者輸入的數值,並以HTTP POST方式傳輸給php
  2. (php)取得使用者裝置傳來的數值,將數值傳入Java程式並執行
  3. (Java)執行結束後將結果返回給php
  4. (php)取得結果後以json格式封裝,傳回給使用者裝置
  5. (Android)取得結果,解碼json

1.(Android)以EditText取得使用者輸入的數值,並以HTTP POST方式傳輸給php

取得使用者input
String input = editText.getText.toString
將input封裝到params這個List裡
params.add(new BasicNameValuePair("input", input));
用HTTP POST的方式送出資料
httpPost.setEntity(new UrlEncodedFormEntity(params));

2.(php)取得使用者裝置傳來的數值,將數值傳入Java程式並執行

取得使用者input
$input= $_POST[‘input’];
執行外部程式,並代入參數
exec(“java –jar path/to/file.jar input”, $output);

3.(Java)執行結束後將結果返回給php

執行Java
public static void main(String[] args){
String input = args[0]; (中間愛幹嘛就幹嘛) System.out.print(結果); }

4.(php)取得結果後以json格式封裝,傳回給使用者裝置

取得Java傳回來的結果(它是陣列)
$result = output[0];
以json格式封裝
die(json_encode($result));

5.(Android)取得結果,解碼json

取得InputStream的內容
Is=httpEntity.getContent();
最後就可以使用BufferReader與JSONObject的方法使用結果了!

HttpClient起手式

當我們用瀏覽器(像是IE、Chrome、Firefox)在逛網站時
可以想像我們的電腦(客戶端,Client)要和網站的電腦(伺服端,Server)一直都在進行溝通
進行溝通的方式大概就是client對server發出要求(request),然後server送回應(response)給client
接著client再想辦法去解析response中所夾帶的資料~

那通常送出request有兩種方法,分別為POST和GET
兩者之間有一點點不同,但這不是這次要講的內容......
這次要說的是Android和網頁或網站傳遞資料的過程當中
所會用到的HttpClient與相關的常用程式碼寫法:

HttpClient起手式

//new一個新的HttpClient物件
DefaultHttpClient httpClient = new DefaultHttpClient();

//看是要用POST或GET方法,new一個出來,並且指定網址(url)
HttpPost httpPost = new HttpPost(url);

//將要傳遞的參數放到params裡面並設定HttpPost的Entity
httpPost.setEntity(new UrlEncodedFormEntity(params));

//new一個HttpResponse來裝httpClient執行之後的結果
HttpResponse httpResponse = httpClient.execute(httpPost);

//使用HttpEntity把內容拿出來
HttpEntity httpEntity = httpResponse.getEntity();

//(範例)內容可以應用在InputStream中
is = httpEntity.getContent();

關於params(傳遞參數,parameters)的設定,它必須使用NameValuePair格式儲存
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));

延伸問題一、HttpClient好像也很常見,和DefaultHttpClient的差別?

DefaultHttpClient是一個類別(Class),HttpClient是一個介面(Interface)
基本上藉由對HttpClient的實作已經可以應付大部分的狀況 (Default implementation of HttpClient pre-configured for most common use scenarios)
DefaultHttpClient之後也不建議使用了(Deprecated),可以使用HttpClientBuilder、CloseableHttpClient等其他方法

延伸問題二、和透過PHP表單輸入的差別?


在PHP中得透過$_POST["name"]的方式來取得表單中的數值,這邊則得要設定params

References


DefaultHttpClient (Apache HttpClient 4.3.6 API)
DefaultHttpClient is deprecated
【Android进阶学习】Http编程之HttpClient