xamarin android网络请求总结

小编 2026-07-03 阅读:762 评论:0
xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架r...

xamarin android中网络请求的框架非常多,在项目中使用的是第三方的一个网络请求框架restsharp,应该是github上.net网络请求最多star的框架,没有之一。这里就简单汇总了其他的一些网络请求的例子,主要还是分为android和.net两种平台。.net 中可以使用HttpWebRequest、HttpClient、RestSharp第三框的一些框架,android的有HttpURLConnectin、HttpClient、OkHttp、Retrofit、Volley

xamarin android网络请求总结

下面就用.net中的httpwebrequest、httpclient、restsharp和android中的httpURLConnection、okhttp实现一个get方式获取图片、post方式提交表单,适合新手入门看看总结一下。 
效果图如下: 
xamarin android网络请求总结

1.HttpWebRquest、HttpWebResponse

命名空间: System.Net;程序集: System(位于 System.dll)

 1   public class HttpWebRequestUtil 2     { 3         //发送get请求获取bytes 4         public static async System.Threading.Tasks.Task<byte[]> GetBytes(string path) 5         { 6             try 7             { 8                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(path); 9                 request.Method = "get";10                 request.Timeout = 500;11                 //request.Proxy设置代理12                 //path 中可添加querystring参数13                 //request.UserAgent 请求的代理14                 HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();15                 if (response.StatusCode == HttpStatusCode.OK)16                 {17                     Stream responseStream = response.GetResponseStream();18                     //将流转成字节19                     byte[] bytes = StreamUtil.StreamToBytes(responseStream);20                     return bytes;21                 }22                 else23                     return null;24             }25             catch (Exception ex)26             {27                 return null;28             }29         }30 31         public static async System.Threading.Tasks.Task<bool> PostForm(string path, string name, string pwd)32         {33             try34             {35                 string formData = "name=" + name +"&pwd=" +pwd ;36                 byte[] bytes = Encoding.UTF8.GetBytes(formData);37                 StringBuilder strBuilder = new StringBuilder();38                 HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(path);39                 request.Method = "get";40                 request.Timeout = 500;41                 request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";42                 request.ContentLength = bytes.Length;43                 request.Method = "Post";44                 Stream requestStream = request.GetRequestStream();45                 requestStream.Write(bytes, 0,  bytes.Length);46                 requestStream.Close();47 48                 HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();49                 if (response.StatusCode == HttpStatusCode.OK)50                 {51                     StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);52                     string content = JsonConvert.DeserializeObject<string>(streamReader.ReadToEnd());53                     streamReader.Close();54                     if (content == "success")55                     {56                         return true;57                     }58                     else59                         return false;60                 }61                 return false;62             }63             catch (Exception ex)64             {65                 return false;66             }67         }68     }

 

2.RestSharp .net常用的http网络请求库

当然重点还是说一下这个的。restsharp在github上的star应该是.net网络请求库最多的,(和第二名的差距比较大)。可以在nuget上直接添加引用restsharp。 
github地址:https://github.com/restsharp/RestSharp 
restSharp官网:http://restsharp.org/ 
stackoverflow上restsharp的相关问题汇总: https://stackoverflow.com/questions/tagged/RestSharp 
restsharp有一下这么几个重要的有点:

  1. 轻量级的、基于HttpWebRequest的封装(不依赖任何第三方组件、支持.net 任何平台上)
  2. 支持异步操作、支持http的get、post、put、delete等操作
  3. 使用简单、易调试、request和response的类型齐全
  4. 功能齐全,支持oAuth 1, oAuth 2, Basic等授权验证、可上传文件
  5. 自定义序列化和反序列化、自动检测返回的内容类型
 1     public class RestSharpUtil 2     { 3         internal static RestClient Instance(string url) 4         { 5             var restClient = new RestClient(url) 6             { 7                 Timeout = 5000, 8                 ReadWriteTimeout = 5000 9             };10             return  restClient;11         }12         public static async System.Threading.Tasks.Task<bool> Post(string url, User user)13         {14             RestClient restClient = Instance(url);15             RestRequest request = new RestRequest();16             //request.AddQueryParameter("id","")  添加url的参数(AddUrlSegment)17             //request.AddHeader("Authorization","token");添加请求头参数18             // request.AddHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8");19             request.AddJsonBody(user);20             //request.AddParameter("application/x-www-form-urlencoded; charset=UTF-8", user, ParameterType.RequestBody);21             var response = await restClient.ExecutePostTaskAsync(request);22             //var response = await restClient.ExecutePostTaskAsync<string>(request); 自动序列化23             if (response.StatusCode == System.Net.HttpStatusCode.OK)24             {25                 var result = JsonConvert.DeserializeObject<string>(response.Content);26                 if (result == "success")27                 {28                     return true;29                 }30                 return false;31             }32             else33             {34                 return false;35             }36         }37         public static async System.Threading.Tasks.Task<byte[]> Get(string url)38         {39             RestClient restClient = Instance(url);40             RestRequest request = new RestRequest();41             var response = await restClient.ExecuteGetTaskAsync(request);42             if (response.StatusCode == System.Net.HttpStatusCode.OK)43             {44                 var bytes = response.RawBytes;45                 return  bytes;46             }47             return null;48         }49     }

 

post请求和get请求在编码类型不同,get:仅一种 application/x-www-form-urlencoded,post:application/x-www-form-urlencoded 或 multipart/form-data……等多种编码方式。 

restsharp在发送post请求方式时必须设置header的content-type解码方式。 
request.AddJsonBody(user);等同于: 
request.AddParameter(“application/x-www-form-urlencoded; charset=UTF-8”, user, ParameterType.RequestBody);等同于: 
request.RequestFormat =DataFormat.Json; 
request.AddBody(user); 
这里备注一下以前犯的一个错误,用了AddBody方法必须添加 request.RequestFormat =DataFormat.Json; ,不然会出异常 
我们看看下面的AddBody的源码可以知道,除restsharp,.net第三方的网络请求框架还有flurl.http。

 1   /// <summary> 2         ///     Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer 3         ///     The default format is XML. Change RequestFormat if you wish to use a different serialization format. 4         /// </summary> 5         /// <param name="obj">The object to serialize</param> 6         /// <param name="xmlNamespace">The XML namespace to use when serializing</param> 7         /// <returns>This request</returns> 8         public IRestRequest AddBody(object obj, string xmlNamespace) 9         {10             string serialized;11             string contentType;12 13             // TODO: Make it possible to change the serialiser14             switch (RequestFormat)15             {16                 case DataFormat.Json:17                     serialized = JsonSerializer.Serialize(obj);18                     contentType = JsonSerializer.ContentType;19                     break;20 21                 case DataFormat.Xml:22                     XmlSerializer.Namespace = xmlNamespace;23                     serialized = XmlSerializer.Serialize(obj);24                     contentType = XmlSerializer.ContentType;25                     break;26 27                 default:28                     serialized = "";29                     contentType = "";30                     break;31             }32 33             // passing the content type as the parameter name because there can only be34             // one parameter with ParameterType.RequestBody so name isn't used otherwise35             // it's a hack, but it works :)36             return AddParameter(contentType, serialized, ParameterType.RequestBody);37         }38 39         /// <summary>40         ///     Serializes obj to data format specified by RequestFormat and adds it to the request body.41         ///     The default format is XML. Change RequestFormat if you wish to use a different serialization format.42         /// </summary>43         /// <param name="obj">The object to serialize</param>44         /// <returns>This request</returns>45         public IRestRequest AddBody(object obj)46         {47             return AddBody(obj, "");48         }49 50         /// <summary>51         ///     Serializes obj to JSON format and adds it to the request body.52         /// </summary>53         /// <param name="obj">The object to serialize</param>54         /// <returns>This request</returns>55         public IRestRequest AddJsonBody(object obj)56         {57             RequestFormat = DataFormat.Json;58 59             return AddBody(obj, "");60         }

 

3.HttpClient

性能上不如httpwebrequest,用的非常少,据说使用的时候要注意不少,这里只是写一个简单的例子,不喜勿喷。 
需要添加引用System.Http.Http

 1   public class HttpClientUtil 2     { 3         public static async System.Threading.Tasks.Task<byte[]> GetBytes(string path) 4         { 5             HttpClient client = new HttpClient(); 6             try 7             { 8                 HttpResponseMessage response = await client.GetAsync(path); 9                 if (response.StatusCode == System.Net.HttpStatusCode.OK)10                 {11                     byte[] bytes = await response.Content.ReadAsByteArrayAsync();12                     return bytes;13                 }14                 return null;15             }16             catch (Exception ex)17             {18                 return null;19             }20             finally21             {22                 client.Dispose();23             }24         }25 26         public static async System.Threading.Tasks.Task<bool> PostForm(string path, Dictionary<string,string> _params)27         {28 29                 var handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip };30                 HttpClient client = new HttpClient();31             try32             {33                 client.Timeout = TimeSpan.FromSeconds(5);34                 //HttpContent httpContent = new StringContent(postData);35                 //httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");36                 HttpContent httpContent = new FormUrlEncodedContent(_params);37                 var response = await client.PostAsync(path, httpContent);38                 if (response.StatusCode == System.Net.HttpStatusCode.OK)39                 {40                     string result = await response.Content.ReadAsStringAsync();41                     result = JsonConvert.DeserializeObject<string>(result);42                     if (result == "success")43                         return true;44                     return false;45                 }46                 return false;47             }48             catch (Exception ex)49             {50                 return false;51             }52             finally53             {54                 client.Dispose();55             }56         }57     }

上面介绍了三种.net方面的网络请求的方法,下面就来说说android方面的网络请求HttpUrlConnection、第三方okhttp。

4.HttpURLConnection

httpURLConnection和HttpWebRequest很相似,是java平台上的一种多用途、轻量级的http客户端,提供的api都非常简单,这一点也是好处,可以使得我们非常方便去拓展他。下面我们简单看下如何使用HttpURLConnection。 
引用来自:Java.Net

  1. HttpURLConnection conn = (HttpURLConnection)url.OpenConnection();创建一个URL对象
  2. conn.ConnectTimeout = 5000; conn.RequestMethod = “get”;设置请求方式和连接超时的时间
  3. inputStream = conn.InputStream;获取服务器返回的输入流
  4. conn.Disconnect();最后调用disconnect方法将http连接关掉
    public class HttpUrlConnecUtil    {        /// <summary>        /// get方式获取byte 数组        /// </summary>        /// <param name="path"></param>        /// <returns></returns>        public static byte[] getImage(string path)        {            URL url = new URL(path);            HttpURLConnection conn = (HttpURLConnection)url.OpenConnection();            conn.ConnectTimeout = 5000;            conn.RequestMethod = "GET";//小写会报错            System.IO.Stream inputStream=null;            try            {                if (conn.ResponseCode == HttpStatus.Ok)                {                    inputStream = conn.InputStream;                    return StreamUtil.StreamToBytes(inputStream);                }                return null;            }            catch (Exception ex)            {                return null;            }            finally            {                inputStream.Close();                conn.Disconnect();            }        }        public static string post(string  path,string  name,string  pwd)        {            string result = string.Empty;            HttpURLConnection conn = (HttpURLConnection)new URL(path).OpenConnection();            conn.RequestMethod = "POST";            conn.ReadTimeout = 5000;            conn.ConnectTimeout = 5000;            //设置运行输入、输出            conn.DoOutput =  true;            conn.DoInput = true;            //post 方式不能缓存,需要手动设置false            conn.UseCaches = false;            string data = "name=" + URLEncoder.Encode(name, "UTF-8") + "&pwd=" + URLEncoder.Encode(pwd,"UTF-8");            Stream outSteam=null;            //获取输出流            try            {                outSteam = conn.OutputStream;                outSteam.Write(Encoding.UTF8.GetBytes(data), 0, data.Length);                outSteam.Flush();                if (conn.ResponseCode == HttpStatus.Ok)                {                    Stream input = conn.InputStream;                    byte[] bytes = StreamUtil.StreamToBytes(input);                    result = bytes.ToString();                }                return result;            }            catch (Exception ex)            {                return "";            }            finally {                outSteam.Close();                conn.Disconnect();            }        }    }            /// <summary>        /// 将流转成byte数组        /// </summary>        /// <param name="stream"></param>        /// <param name="bytes"></param>        public static  byte[] StreamToBytes(Stream stream)        {            MemoryStream memoryStream = new MemoryStream();            byte[] buffer = new byte[64 * 1024];            int i;            try            {                while ((i = stream.Read(buffer, 0, buffer.Length)) > 0)                {                    memoryStream.Write(buffer, 0, i);                }                var bytes = memoryStream.ToArray();                return bytes;            }            catch (Exception ex)            {                return null;            }            finally {                memoryStream.Close();                stream.Close();            }        }
 

5.OkHttp 最火的android网络请求框架

okhttp是一个第三方的网络请求框架,被广泛适用于android中请求网络数据,是一个一个轻量级的框架,有移动支付Square公司贡献(Picasso和LeakCanary),和HttpURLConnection和api是一致的。在xamarin android中使用的时候需要在nuget中添加引用OkHttp,命名空间:using Square.OkHttp3; 
okhttp官网:http://square.github.io/okhttp/ 
github地址:https://github.com/square/okhttp 
除了okhttp外,android中比较流行的网络请求框架还有 
retrofit,retrofit2依赖于okhttp;github地址:http://square.github.io/retrofit/,拓展性比较强 
volley:google在2013年推出的android异步网络请求框架和图片加载框架 
下面看看,如何在xamarin android中使用okhttp发送get,post请求吧。

 public class OkHttpClientUtil    {        private OkHttpClient httpClient;        public OkHttpClientUtil()        {             httpClient = new OkHttpClient.Builder()            .ConnectTimeout(5, TimeUnit.Seconds)//连接超时5秒            .WriteTimeout(5, TimeUnit.Seconds)//写入数据超时5秒            .ReadTimeout(5, TimeUnit.Seconds)//读取数据超时5秒            .Build();        }        public static OkHttpClientUtil Instance()        {            return new OkHttpClientUtil();        }        public async System.Threading.Tasks.Task<bool> Post(string url, User user)        {            FormBody.Builder formBody = new FormBody.Builder(); //创建表单请求体            formBody.Add("name", user.Name);            formBody.Add("pwd", user.Pwd);            Request request = new Request.Builder().AddHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8").Url(url).Post(formBody.Build()).Build();            var response = await httpClient.NewCall(request).ExecuteAsync();            if (response.Code() == 200)            {                var  result =JsonConvert.DeserializeObject<string>(response.Body().String());                if (result == "success")                {                    return true;                }                return false;            }            return false;        }        public  async System.Threading.Tasks.Task<byte[]> Get(string url)        {            Request request = new Request.Builder().Url(url).Build();            Response response = await httpClient.NewCall(request).ExecuteAsync();            if (response.Code() == 200)            {                var stream = response.Body().ByteStream();                var bytes = StreamUtil.StreamToBytes(stream);                return bytes;            }            return null;        }    }

 

 
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表