xamarin學習筆記A16(安卓OkHttp3和HttpURLConnection)下

(每次學習一點xamarin就做個學習筆記和視頻來加深記憶鞏固知識)

如有不正確的地方,請幫我指正。

簡介

    上次的學習筆記學習瞭如何進行GET請求,那麼這次學習一下如何進行POST請求。

 

使用HttpURLConnection進行POST請求

直接上C#代碼(記得在AndroidManifest.xml文件中聲明網絡權限<uses-permissionandroid:name="android.permission.INTERNET"/>

/// <summary>
        /// 使用原生的HttpURLConnection類進行POST請求
        /// </summary>
        /// <param name="address">請求地址</param>
        /// <param name="str">需要POST到服務器的數據</param>
        /// <param name="listener">監聽對象</param>
        public static void PostHttpRequest(string address, string str, IHttpListener listener)
        {
            new Thread(new ThreadStart(
                    () =>
                    {
                        #region 子線程執行請求
                        HttpURLConnection conn = null;
                        try
                        {
                            URL url = new URL(address);
                            conn = (HttpURLConnection)url.OpenConnection(); //打開http連接
                            conn.RequestMethod = "POST"; //設置爲post請求
                            conn.ConnectTimeout = 8000; //設置連接超時時間爲8秒
                            conn.ReadTimeout = 8000; //設置讀取數據超時時間爲8秒
                            conn.DoInput = true; //允許接收數據,以後就可以使用conn.InputStream (Get請求時用)
                            conn.DoOutput = true; //允許發送數據,以後就可以使用conn.OutputStream (POST時用, Get請求時加上這句會變Post)
                            //conn.SetRequestProperty("Content-Type", "application/json;chartset=UTF-8");

                            Stream outStream = conn.OutputStream; //得到輸出流對象
                            byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(str); //將要上傳的數據轉爲字節
                            outStream.Write(byteData, 0, byteData.Length); //向當前流中寫入字節
                            outStream.Flush(); //清除該流的所有緩衝區,並使得所有緩衝數據被寫入到基礎設備
                            outStream.Close(); //關閉當前流並釋放與之關聯的所有資源

                            StringBuilder sb = new StringBuilder();
                            Stream inStream = conn.InputStream;//實際發送請求
                            using (StreamReader reader = new StreamReader(inStream, Encoding.UTF8))
                            {
                                string line;
                                while ((line = reader.ReadLine()) != null)
                                {
                                    sb.Append(line);
                                }
                            }

                            if (listener != null)
                                listener.OnFinish(sb.ToString()); //回調OnFinish()方法
                        }
                        catch (Exception e)
                        {
                            if (listener != null)
                                listener.OnError(e); //回調OnError()方法
                        }
                        finally
                        {
                            if (conn != null)
                                conn.Disconnect(); //關閉連接
                        }
                        #endregion
                    }
                )).Start();
        }

使用Square.OKHttp3進行POST請求

直接上C#代碼

//定義Http請求頭的Content-Type, OKhttp3需要使用MediaType這個類
        public static readonly MediaType MediaType_JSON = MediaType.Parse("application/json;chartset=UTF-8");
        public static readonly MediaType MediaType_TEXT = MediaType.Parse("text/plain;chartset=UTF-8");

public static void PostHttpRequestByOkHttp3(string address, string str, MediaType mediaType, Square.OkHttp3.ICallback callback)
        {
            OkHttpClient httpClient = new OkHttpClient.Builder()
                .ConnectTimeout(8, TimeUnit.Seconds) //設置連接超時時間爲8秒
                .WriteTimeout(8, TimeUnit.Seconds) //設置寫數據的超時時間爲8秒
                .ReadTimeout(8, TimeUnit.Seconds) //設置讀取數據的超時時間爲8秒
                .Build();

            RequestBody requestBody = RequestBody.Create(mediaType, str);

            Request request = new Request.Builder()
                .Url(address)
                .Post(requestBody)
                .Build();
            httpClient.NewCall(request).Enqueue(callback);//在Enqueue()方法內部自動開好子線程了
        }

在Activity中分別使用,主要代碼如下,另外訪問本機的Web服務器端程序時需要注意:localhost會被認爲是模擬器自己,而10.0.2.2是安卓越內置的特定IP,表示本機。所以模擬器上訪問本機得用10.0.2.2

case Resource.Id.button2:
                    //C.用原生HttpURLConnection 進行POST請求
                    User[] userArray = new User[]
                        {
                            new User{ UserId=3, UserName="xiaoming" },
                            new User{ UserId=4, UserName="xiaoyan"}
                        };
                    string json = JsonConvert.SerializeObject(userArray);
                    HttpHelper.PostHttpRequest("http://10.0.2.2:56010/api/values", json, this);
                    //D.使用OkHttp3 進行POST請求
                    //HttpHelper.PostHttpRequestByOkHttp3("http://10.0.2.2:56010/api/values", json, HttpHelper.MediaType_TEXT, this);
                    break;

順便學習下在安卓中JSON的使用

在.net中處理JSON用得比較多的是開源庫Newtonsoft.Json 。在安卓中也可使用原生的JSONObject類來處理JSON。

它們的使用分別如下

//先得從Nuget中下載Newtonsoft.Json

private void ParseJsonByNewtonsoft(string json)//使用開源庫Newtonsoft.Json來解析json數據
        {
            var userList = JsonConvert.DeserializeObject<List<User>>(json);
            foreach (User user in userList)
            {
                Toast.MakeText(this, string.Format("userId={0} userName={1}", user.UserId, user.UserName), ToastLength.Short).Show();
            }
        }

private void ParseJson(string json)//使用安卓原生的JSONObject來解析json數據
        {
            try
            {
                JSONArray jsonArray = new JSONArray(json);
                for (int i = 0; i < jsonArray.Length(); i++)
                {
                    JSONObject jsonObj = jsonArray.GetJSONObject(i);
                    int userId = jsonObj.GetInt("UserId");
                    string userName = jsonObj.GetString("UserName");

                    Toast.MakeText(this, string.Format("userId={0} userName={1}", userId, userName), ToastLength.Long).Show();
                }

            }
            catch (Exception)
            {
                throw;
            }
        }

完整代碼和視頻在我上傳的CSDN資源中http://download.csdn.net/download/junshangshui/10049308
發佈了74 篇原創文章 · 獲贊 50 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章