接續昨天的範例,在Layout的部份,再增加二個可以輸入的EditText元件及一個Button元件,如下圖所示:
拉好畫面,接下來,開始處理程式的部份。跟呼叫Get的函式差不多,只是再增加要輸入參數的函式。完整的程式碼:
public class MainActivity extends AppCompatActivity {
//宣告物件名稱。
private RequestQueue objqueue;
private final static String strurl = "http://192.168.1.102:8088/get_json.php";
private TextView lbl_result;
private StringRequest getRequest;
//宣告物件 (POST物件)
private RequestQueue objpostqueue;
private StringRequest postRequest;
private final static String strposturl = "http://192.168.1.102:8088/frm_addnew.php";
private EditText txt_title;
private EditText txt_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//物件名稱跟Layout上的物件,產生連結。
lbl_result = (TextView)findViewById(R.id.lblresult);
//設定Volley物件。
objqueue = Volley.newRequestQueue(this);
//實做Volley物件,在StringRequest的函式,預設值就是Request.Method.GET,可以省略。
//而strurl,就是要GET的API網址。
//最後,還要Override二個監聽的事件。
getRequest = new StringRequest(strurl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//response,表示是回傳值,就是API要回傳的字串,也可以是JSON字串。
lbl_result.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//如果發生錯誤,就是回傳VolleyError,可以顯示是什麼錯誤。
lbl_result.setText(error.getMessage());
}
});
//物件名稱跟Layout的物件,產生連結 (POST物件)
txt_title = (EditText)findViewById(R.id.txttitle);
txt_content = (EditText)findViewById(R.id.txtcontent);
//設定Volley物件。 (POST物件)
objpostqueue = Volley.newRequestQueue(this);
//實做Volley物件,在StringRequest的函式,第一個參數,要宣告Request.Method.POST。
//而strposturl,就是要POST的API網址。
//最後,還要Override二個監聽的事件。
postRequest = new StringRequest(Request.Method.POST, strposturl,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//response,表示是回傳值,就是API要回傳的字串,也可以是JSON字串。
lbl_result.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//如果發生錯誤,就是回傳VolleyError,可以顯示是什麼錯誤。
lbl_result.setText(error.getMessage());
}
}) {
@Override
protected HashMap<String,String> getParams()
throws AuthFailureError {
//跟GET模式不同的是,後續要加入傳入參數的函式。
HashMap<String,String> hashMap = new HashMap<String,String>();
String strtitle = "";
String strcontent = "";
//取得Layout輸入的資料,再用HashMap型態POST到PHP網頁。
strtitle = txt_title.getText().toString();
strcontent = txt_content.getText().toString();
hashMap.put("ptitle",strtitle);
hashMap.put("pcontent",strcontent);
return hashMap;
}
};
}
//建立此函式,要設定Button的觸發事件函式。
public void prc_getmessage (View v) {
//將getRequest物件加入Volley物件的queue中,執行跟API的溝通。
objqueue.add(getRequest);
}
//建立此函式,要設定Button的觸發事件函式。
public void prc_postmessage(View v) {
//將postRequest物件加入Volley物件的queue中,執行跟API的溝通。
objpostqueue.add(postRequest);
}
在Server端的PHP API程式碼:
<?php
echo "send msg ok, title:".$_POST["ptitle"]." content:".$_POST["pcontent"];
?>
就簡單的抓到POST的兩個參數,再取得值,組成回傳字串即可。
在執行模擬器時,可以看到二個要輸入的欄位,輸入測試的資料,再按下「POST」按鈕,就成功的呼叫POST的API,回傳將輸入的資料,再組成的字串。如下圖所示: