xamarin android网络请求总结

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

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

这里写图片描述

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

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                 else
23                     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             try
34             {
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                     else
59                         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             else
33             {
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 serialiser
14             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 be
34             // one parameter with ParameterType.RequestBody so name isn't used otherwise
35             // 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             finally
21             {
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             try
32             {
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             finally
53             {
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;
        }
    }

 

 
目录
相关文章
|
2月前
|
Android开发
Android网络访问超时
Android网络访问超时
26 2
|
2月前
|
Java Linux API
统计android设备的网络数据使用量
统计android设备的网络数据使用量
51 0
|
21天前
|
缓存 网络协议 安全
Android网络面试题之Http基础和Http1.0的特点
**HTTP基础:GET和POST关键差异在于参数传递方式(GET在URL,POST在请求体),安全性(POST更安全),数据大小限制(POST无限制,GET有限制),速度(GET较快)及用途(GET用于获取,POST用于提交)。面试中常强调POST的安全性、数据量、数据类型支持及速度。HTTP 1.0引入了POST和HEAD方法,支持多种数据格式和缓存,但每个请求需新建TCP连接。**
24 5
|
19天前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
25 2
|
25天前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
42 9
|
20天前
|
缓存 网络协议 Android开发
Android网络面试题之Http1.1和Http2.0
HTTP/1.1 引入持久连接和管道机制提升效率,支持分块传输编码和更多请求方式如PUT、PATCH。Host字段指定服务器域名,RANGE用于断点续传。HTTP/2变为二进制协议,实现多工处理,头信息压缩和服务器推送,减少延迟并优化资源加载。HTTP不断发展,从早期的简单传输到后来的高效交互。
23 0
Android网络面试题之Http1.1和Http2.0
|
25天前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
50 1
|
29天前
|
缓存 网络协议 Java
Android面试题之Java网络通信基础知识
Socket是应用与TCP/IP通信的接口,封装了底层细节。网络通信涉及连接、读写数据。BIO是同步阻塞,NIO支持多路复用(如Selector),AIO在某些平台提供异步非阻塞服务。BIO示例中,服务端用固定线程池处理客户端请求,客户端发起连接并读写数据。NIO的关键是Selector监控多个通道的事件,减少线程消耗。书中推荐《Java网络编程》和《UNIX网络编程》。关注公众号AntDream了解更多。
24 2
|
1月前
|
XML JSON Java
Android面试题 之 网络通信基础面试题
序列化对比:Serializable码流大、性能低;XML人机可读但复杂;JSON轻量、兼容性好但空间消耗大;ProtoBuff高效紧凑。支持大量长连接涉及系统限制调整、缓冲区优化。select/poll/epoll是IO多路复用,epoll在高连接数下性能更优且支持边缘触发。水平触发持续通知数据,边缘触发仅通知新数据。直接内存减少一次拷贝,零拷贝技术如sendfile和MMAP提升效率。关注公众号&quot;AntDream&quot;了解更多技术细节。
18 1
|
1月前
|
安全 Android开发 数据安全/隐私保护
同样的 APP 为何在 Android 8 以后网络感觉变卡?
【6月更文挑战第8天】Android 8 及以后系统中,APP 网络感觉变卡源于更严格的安全机制和后台限制,系统对网络优化的侧重改变,以及APP自身兼容性问题。开发者需优化APP,适应新系统,用户可更新APP或检查权限设置。通过共同努力,有望改善网络卡顿现象,提升用户体验。