(每次学习一点xamarin就做个学习笔记和视频来加深记忆巩固知识)
如有不正确的地方,请帮我指正。
简介
上次的学习笔记学习了如何进行GET请求,那么这次学习一下如何进行POST请求。
使用HttpURLConnection进行POST请求
直接上C#代码(记得在AndroidManifest.xml文件中声明网络权限
///
/// 使用原生的HttpURLConnection类进行POST请求
///
/// 请求地址
/// 需要POST到服务器的数据
/// 监听对象
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>(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;
}
}