(每次學習一點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