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 ...
随机推荐
- 解决ecshop3.6 H5版本公告页面为空的修改办法
ecshop3.6公告页面打开如下,页面完全无效果,如下图. 经过简单美化后,有返回按钮,页面加以美化.如下图. 是不是要好看多了.简单修改几步即可. 修改文件 \appserver\resource ...
- 设置eclipse全局编码格式
window--preference--general--workspace--text file encoding
- treeview调用数据库成树
目的:将数据库中的数据与树控件绑定背景:我们想在树控件中显示销售客户的层级列表,这个销售客户的分层是这样的,先按"大区",再按"省份",最后到"客户& ...
- Flask构建微电影(一)
第一章.项目介绍 1.1.前言 本教程我将带领大家如何使用flask框架开发微电影网站.Flask是python中最受欢迎的轻量级web框架,flask扩展丰富,冗余度小,可自由选择组合各种插 ...
- python_函数默认参数设计
>>> def printMax(a,b): if a>b: print(a,'is the max') else: print(b,'is hte max') >> ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- JS 数据类型、赋值、深拷贝和浅拷贝
js 数据类型 六种 基本数据类型: Boolean. 布尔值,true 和 false. null. 一个表明 null 值的特殊关键字. JavaScript 是大小写敏感的,因此 null 与 ...
- PAT1070:Mooncake
1070. Mooncake (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mooncake is ...
- NIO之FileChannel类的理解和使用
文章链接:http://blog.csdn.net/qq_16628781/article/details/70532307 知识点: FileChannel类及方法理解: 普通输入输出流复制文件: ...
- SSM-Spring-05:Spring的bean是单例还是多例,怎么改变?
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- Spring的bean是单例的 它在Spring容器初始化的时候创建对象 可以修改为多例,在此bean节点中添 ...