接續昨天的範例,在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,回傳將輸入的資料,再組成的字串。如下圖所示: