xamarin android网络请求总结
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)
public class HttpWebRequestUtil
{
//发送get请求获取bytes
public static async System.Threading.Tasks.Task<byte[]> GetBytes(string path)
{
try
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(path);
request.Method = "get";
request.Timeout = ;
//request.Proxy设置代理
//path 中可添加querystring参数
//request.UserAgent 请求的代理
HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
//将流转成字节
byte[] bytes = StreamUtil.StreamToBytes(responseStream);
return bytes;
}
else
return null;
}
catch (Exception ex)
{
return null;
}
} public static async System.Threading.Tasks.Task<bool> PostForm(string path, string name, string pwd)
{
try
{
string formData = "name=" + name +"&pwd=" +pwd ;
byte[] bytes = Encoding.UTF8.GetBytes(formData);
StringBuilder strBuilder = new StringBuilder();
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(path);
request.Method = "get";
request.Timeout = ;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.ContentLength = bytes.Length;
request.Method = "Post";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, , bytes.Length);
requestStream.Close(); HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
if (response.StatusCode == HttpStatusCode.OK)
{
StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string content = JsonConvert.DeserializeObject<string>(streamReader.ReadToEnd());
streamReader.Close();
if (content == "success")
{
return true;
}
else
return false;
}
return false;
}
catch (Exception ex)
{
return false;
}
}
}
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有一下这么几个重要的有点:
- 轻量级的、基于HttpWebRequest的封装(不依赖任何第三方组件、支持.net 任何平台上)
- 支持异步操作、支持http的get、post、put、delete等操作
- 使用简单、易调试、request和response的类型齐全
- 功能齐全,支持oAuth 1, oAuth 2, Basic等授权验证、可上传文件
- 自定义序列化和反序列化、自动检测返回的内容类型
public class RestSharpUtil
{
internal static RestClient Instance(string url)
{
var restClient = new RestClient(url)
{
Timeout = ,
ReadWriteTimeout =
};
return restClient;
}
public static async System.Threading.Tasks.Task<bool> Post(string url, User user)
{
RestClient restClient = Instance(url);
RestRequest request = new RestRequest();
//request.AddQueryParameter("id","") 添加url的参数(AddUrlSegment)
//request.AddHeader("Authorization","token");添加请求头参数
// request.AddHeader("content-type", "application/x-www-form-urlencoded; charset=UTF-8");
request.AddJsonBody(user);
//request.AddParameter("application/x-www-form-urlencoded; charset=UTF-8", user, ParameterType.RequestBody);
var response = await restClient.ExecutePostTaskAsync(request);
//var response = await restClient.ExecutePostTaskAsync<string>(request); 自动序列化
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
var result = JsonConvert.DeserializeObject<string>(response.Content);
if (result == "success")
{
return true;
}
return false;
}
else
{
return false;
}
}
public static async System.Threading.Tasks.Task<byte[]> Get(string url)
{
RestClient restClient = Instance(url);
RestRequest request = new RestRequest();
var response = await restClient.ExecuteGetTaskAsync(request);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
var bytes = response.RawBytes;
return bytes;
}
return null;
}
}
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。
/// <summary>
/// Serializes obj to format specified by RequestFormat, but passes xmlNamespace if using the default XmlSerializer
/// The default format is XML. Change RequestFormat if you wish to use a different serialization format.
/// </summary>
/// <param name="obj">The object to serialize</param>
/// <param name="xmlNamespace">The XML namespace to use when serializing</param>
/// <returns>This request</returns>
public IRestRequest AddBody(object obj, string xmlNamespace)
{
string serialized;
string contentType; // TODO: Make it possible to change the serialiser
switch (RequestFormat)
{
case DataFormat.Json:
serialized = JsonSerializer.Serialize(obj);
contentType = JsonSerializer.ContentType;
break; case DataFormat.Xml:
XmlSerializer.Namespace = xmlNamespace;
serialized = XmlSerializer.Serialize(obj);
contentType = XmlSerializer.ContentType;
break; default:
serialized = "";
contentType = "";
break;
} // passing the content type as the parameter name because there can only be
// one parameter with ParameterType.RequestBody so name isn't used otherwise
// it's a hack, but it works :)
return AddParameter(contentType, serialized, ParameterType.RequestBody);
} /// <summary>
/// Serializes obj to data format specified by RequestFormat and adds it to the request body.
/// The default format is XML. Change RequestFormat if you wish to use a different serialization format.
/// </summary>
/// <param name="obj">The object to serialize</param>
/// <returns>This request</returns>
public IRestRequest AddBody(object obj)
{
return AddBody(obj, "");
} /// <summary>
/// Serializes obj to JSON format and adds it to the request body.
/// </summary>
/// <param name="obj">The object to serialize</param>
/// <returns>This request</returns>
public IRestRequest AddJsonBody(object obj)
{
RequestFormat = DataFormat.Json; return AddBody(obj, "");
}
3.HttpClient
性能上不如httpwebrequest,用的非常少,据说使用的时候要注意不少,这里只是写一个简单的例子,不喜勿喷。
需要添加引用System.Http.Http
public class HttpClientUtil
{
public static async System.Threading.Tasks.Task<byte[]> GetBytes(string path)
{
HttpClient client = new HttpClient();
try
{
HttpResponseMessage response = await client.GetAsync(path);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
byte[] bytes = await response.Content.ReadAsByteArrayAsync();
return bytes;
}
return null;
}
catch (Exception ex)
{
return null;
}
finally
{
client.Dispose();
}
} public static async System.Threading.Tasks.Task<bool> PostForm(string path, Dictionary<string,string> _params)
{ var handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip };
HttpClient client = new HttpClient();
try
{
client.Timeout = TimeSpan.FromSeconds();
//HttpContent httpContent = new StringContent(postData);
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");
HttpContent httpContent = new FormUrlEncodedContent(_params);
var response = await client.PostAsync(path, httpContent);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
string result = await response.Content.ReadAsStringAsync();
result = JsonConvert.DeserializeObject<string>(result);
if (result == "success")
return true;
return false;
}
return false;
}
catch (Exception ex)
{
return false;
}
finally
{
client.Dispose();
}
}
}
上面介绍了三种.net方面的网络请求的方法,下面就来说说android方面的网络请求HttpUrlConnection、第三方okhttp。
4.HttpURLConnection
httpURLConnection和HttpWebRequest很相似,是java平台上的一种多用途、轻量级的http客户端,提供的api都非常简单,这一点也是好处,可以使得我们非常方便去拓展他。下面我们简单看下如何使用HttpURLConnection。
引用来自:Java.Net
- HttpURLConnection conn = (HttpURLConnection)url.OpenConnection();创建一个URL对象
- conn.ConnectTimeout = 5000; conn.RequestMethod = “get”;设置请求方式和连接超时的时间
- inputStream = conn.InputStream;获取服务器返回的输入流
- 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 = ;
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 = ;
conn.ConnectTimeout = ;
//设置运行输入、输出
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), , 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[ * ];
int i;
try
{
while ((i = stream.Read(buffer, , buffer.Length)) > )
{
memoryStream.Write(buffer, , 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(, TimeUnit.Seconds)//连接超时5秒
.WriteTimeout(, TimeUnit.Seconds)//写入数据超时5秒
.ReadTimeout(, 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() == )
{
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() == )
{
var stream = response.Body().ByteStream();
var bytes = StreamUtil.StreamToBytes(stream);
return bytes;
}
return null;
}
}
有兴趣关注一下我的个人公众号,专注dotNet开发,谢谢

xamarin android网络请求总结的更多相关文章
- Xamarin Android权限请求
Xamarin Android权限请求 Android权限规定了App是否可以访问特定的资源,如网络.电话和短信.在原有API 6.0之前,App在安全的时候,会请求一次权限.一旦安装后,App就 ...
- Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)
最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所 ...
- Android 网络请求框架Retrofit
Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...
- Android 网络请求及数据处理
Android 网络请求: 1.Volley http://blog.csdn.net/t12x3456/article/details/9221611 2.Android-Async-Http ...
- Android 网络请求Retrofit + RxJava
一.背景 经常看到项目用Retrofit+RxJava+RxAndroid的框架,为了看懂项目的结构.现在来了解一下,Retrofit: Retrofit是Square 公司开发的一款正对Androi ...
- android 网络请求Ⅰ
本章讲述在android开发中,常用的网络请求操作.网络请求利用android基本的HttpURLConnection连接URL和开源网络请求包AsyncHttpClient.本次网络请求以调取天气接 ...
- Android网络请求通信之Volley
一.Volley简介 Volley网络框架是Google公司在2013年发布的一款Android平台上的网络请求通信库.以下是对Volley的简单归纳. Volley的优点: 使网络通信更快.更简单. ...
- android 网络请求库的比较
源码请戳 一. 现有库和选择的库 HttpURLConnection:是Java中的标准类,是对Java中socket的封装. Httpclient:是Apache的开源框架,是对HttpURLCon ...
- 浅论Android网络请求库——android-async-http
在iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Insta ...
随机推荐
- mysql性能优化之-innodb_flush_log_at_trx_commit
innodb_flush_log_at_trx_commit是配置MySql日志何时写入硬盘的参数: 一.参数值说明 0:log buffer将每秒一次地写入log file中,并且log file的 ...
- oracel 拆分字符串
CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000); CREATE OR REPLACE FUNCTION splitstr(p_ ...
- 关于Linux和Unix的分析
Linux操作系统即linux. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软 ...
- Spring MVC “404 Not Found”错误的解决
一般这个问题发生的原因不会出在Web.xml配置文件的Servlet URL映射部分,因为这个URL映射做JavaWeb的人经常配置不会发生错误,而且此处的这个映射自由度很大,可以有目录字符串,也可以 ...
- IT桔子沙龙之本地生活服务O2O探路者笔记整理
这个沙龙活动侧重于创业融资与投资角度 主持人:真格基金投资分析师顾女士;E-mail:grace@zhenfund.com;新浪微博:@顾三小姐 赞助商七牛云的服务宣传:静态资源托管:上传下载全网加速 ...
- 利用Tess4J实现图片识别
一.下载 1.进入官网下载页面 https://sourceforge.net/projects/tess4j/ 2.点击download 3.下载后解压,目录如下,圈出的三个文件夹是需要用到的 二. ...
- 技术人应该学习的行话--UML统一建模语言
新生代码农如何在硝烟弥漫的商业丛林中生存和崛起? 洞见,让一部分先遇见未来. 最近公司技术部在组织架构师培训,有幸参与.导师老刘特别推荐了UML语言的学习.回想多年来,自己习惯做一些流程图,框图或者所 ...
- linux上nginx新建站点
遇到一个要将后台部分模块剥离出来,重新放到一个新的后台上的问题: 这样一来,就要在服务器上新建站点,but,服务器是linux系统的,不是很熟,经过多方努力,搞定了 在这记录一下,用到的linux命令 ...
- JVM学习记录-垃圾回收算法
简述 因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法. JVM中常见的垃圾收集算法有以下四种: 标记-清除算法(Mark-Sweep). 复制算法(Copying). ...
- vs2015 key
vs2015 企业版 专业版 密钥 亲测可用 专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV