Xamarin.Android之封装个简单的网络请求类
一、前言
回忆到上篇 《Xamarin.Android再体验之简单的登录Demo》 做登录时,用的是GET的请求,还用的是同步,
于是现在将其简单的改写,做了个简单的封装,包含基于HttpClient和HttpWebRequest两种方式的封装。
由于对这一块还不是很熟悉,所以可能不是很严谨。
二、先上封装好的代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Json;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks; namespace Catcher.AndroidDemo.Common
{
public static class EasyWebRequest
{
/// <summary>
/// send the post request based on HttpClient
/// </summary>
/// <param name="requestUrl">the url you post</param>
/// <param name="routeParameters">the parameters you post</param>
/// <returns>return a response object</returns>
public static async Task<object> SendPostRequestBasedOnHttpClient(string requestUrl, IDictionary<string, string> routeParameters)
{
object returnValue = new object();
HttpClient client = new HttpClient();
client.MaxResponseContentBufferSize = ;
Uri uri = new Uri(requestUrl);
var content = new FormUrlEncodedContent(routeParameters);
try
{
var response = await client.PostAsync(uri, content);
if (response.IsSuccessStatusCode)
{
var stringValue = await response.Content.ReadAsStringAsync();
returnValue = JsonObject.Parse(stringValue);
}
}
catch (Exception ex)
{
throw ex;
}
return returnValue;
} /// <summary>
/// send the get request based on HttpClient
/// </summary>
/// <param name="requestUrl">the url you post</param>
/// <param name="routeParameters">the parameters you post</param>
/// <returns>return a response object</returns>
public static async Task<object> SendGetRequestBasedOnHttpClient(string requestUrl, IDictionary<string, string> routeParameters)
{
object returnValue = new object();
HttpClient client = new HttpClient();
client.MaxResponseContentBufferSize = ;
//format the url paramters
string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
Uri uri = new Uri(string.Format("{0}?{1}", requestUrl, paramters));
try
{
var response = await client.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
var stringValue = await response.Content.ReadAsStringAsync();
returnValue = JsonObject.Parse(stringValue);
}
}
catch (Exception ex)
{
throw ex;
}
return returnValue;
} /// <summary>
/// send the get request based on HttpWebRequest
/// </summary>
/// <param name="requestUrl">the url you post</param>
/// <param name="routeParameters">the parameters you post</param>
/// <returns>return a response object</returns>
public static async Task<object> SendGetHttpRequestBaseOnHttpWebRequest(string requestUrl, IDictionary<string, string> routeParameters)
{
object returnValue = new object();
string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
Uri uri = new Uri(string.Format("{0}?{1}", requestUrl, paramters));
var request = (HttpWebRequest)HttpWebRequest.Create(uri); using (var response = request.GetResponseAsync().Result as HttpWebResponse)
{
if (response.StatusCode == HttpStatusCode.OK)
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string stringValue = await reader.ReadToEndAsync();
returnValue = JsonObject.Parse(stringValue);
}
}
}
}
return returnValue;
} /// <summary>
/// send the post request based on httpwebrequest
/// </summary>
/// <param name="url">the url you post</param>
/// <param name="routeParameters">the parameters you post</param>
/// <returns>return a response object</returns>
public static async Task<object> SendPostHttpRequestBaseOnHttpWebRequest(string url, IDictionary<string, string> routeParameters)
{
object returnValue = new object(); HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST"; byte[] postBytes = null;
request.ContentType = "application/x-www-form-urlencoded";
string paramters = string.Join("&", routeParameters.Select(p => p.Key + "=" + p.Value));
postBytes = Encoding.UTF8.GetBytes(paramters.ToString()); using (Stream outstream = request.GetRequestStreamAsync().Result)
{
outstream.Write(postBytes, , postBytes.Length);
} using (HttpWebResponse response = request.GetResponseAsync().Result as HttpWebResponse)
{
if (response.StatusCode == HttpStatusCode.OK)
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string stringValue = await reader.ReadToEndAsync();
returnValue = JsonObject.Parse(stringValue);
}
}
}
}
return returnValue;
}
}
}
需要说明一下的是,我把这个方法当做一个公共方法抽离到一个单独的类库中

三、添加两个数据服务的方法
[HttpPost]
public ActionResult PostThing(string str)
{
var json = new
{
Code ="",
Msg = "OK",
Val = str
};
return Json(json);
} public ActionResult GetThing(string str)
{
var json = new
{
Code = "",
Msg = "OK",
Val = str
};
return Json(json,JsonRequestBehavior.AllowGet);
}
这两个方法,一个是为了演示post,一个是为了演示get
部署在本地的IIS上便于测试!
四、添加一个Android项目,测试我们的方法
先来看看页面,一个输入框,四个按钮,这四个按钮分别对应一种请求。

然后是具体的Activity代码
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;
using Catcher.AndroidDemo.Common;
using System.Json; namespace Catcher.AndroidDemo.EasyRequestDemo
{
[Activity(Label = "简单的网络请求Demo", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
EditText txtInput;
Button btnPost;
Button btnGet;
Button btnPostHWR;
Button btnGetHWR;
TextView tv; protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle); SetContentView(Resource.Layout.Main); txtInput = FindViewById<EditText>(Resource.Id.txt_input);
btnPost = FindViewById<Button>(Resource.Id.btn_post);
btnGet = FindViewById<Button>(Resource.Id.btn_get);
btnGetHWR = FindViewById<Button>(Resource.Id.btn_getHWR);
btnPostHWR = FindViewById<Button>(Resource.Id.btn_postHWR);
tv = FindViewById<TextView>(Resource.Id.tv_result); //based on httpclient
btnPost.Click += PostRequest;
btnGet.Click += GetRequest;
//based on httpwebrequest
btnPostHWR.Click += PostRequestByHWR;
btnGetHWR.Click += GetRequestByHWR;
} private async void GetRequestByHWR(object sender, EventArgs e)
{
string url = "http://192.168.1.102:8077/User/GetThing";
IDictionary<string, string> routeParames = new Dictionary<string, string>();
routeParames.Add("str", this.txtInput.Text);
var result = await EasyWebRequest.SendGetHttpRequestBaseOnHttpWebRequest(url, routeParames);
var data = (JsonObject)result;
this.tv.Text = "hey," + data["Val"] + ", i am from httpwebrequest get";
} private async void PostRequestByHWR(object sender, EventArgs e)
{
string url = "http://192.168.1.102:8077/User/PostThing";
IDictionary<string, string> routeParames = new Dictionary<string, string>();
routeParames.Add("str", this.txtInput.Text);
var result = await EasyWebRequest.SendPostHttpRequestBaseOnHttpWebRequest(url, routeParames);
var data = (JsonObject)result;
this.tv.Text = "hey," + data["Val"] + ", i am from httpwebrequest post";
} private async void PostRequest(object sender, EventArgs e)
{
string url = "http://192.168.1.102:8077/User/PostThing";
IDictionary<string, string> routeParames = new Dictionary<string, string>();
routeParames.Add("str", this.txtInput.Text);
var result = await EasyWebRequest.SendPostRequestBasedOnHttpClient(url, routeParames);
var data = (JsonObject)result;
this.tv.Text = "hey," + data["Val"] + ", i am from httpclient post";
} private async void GetRequest(object sender, EventArgs e)
{
string url = "http://192.168.1.102:8077/User/GetThing";
IDictionary<string, string> routeParames = new Dictionary<string, string>();
routeParames.Add("str", this.txtInput.Text);
var result = await EasyWebRequest.SendGetRequestBasedOnHttpClient(url, routeParames);
var data = (JsonObject)result;
this.tv.Text = "hey," + data["Val"] + ", i am from httpclient get";
}
}
}
OK,下面看看效果图

如果那位大哥知道有比较好用的开源网络框架推荐请告诉我!!
最后放上本次示例的代码:
https://github.com/hwqdt/Demos/tree/master/src/Catcher.AndroidDemo
Xamarin.Android之封装个简单的网络请求类的更多相关文章
- Android之封装好的异步网络请求框架
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnection,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使 ...
- Android 最早使用的简单的网络请求
下面是最早从事android开发的时候写的网络请求的代码,简单高效,对于理解http请求有帮助.直接上代码,不用解释,因为非常简单. import java.io.BufferedReader; im ...
- 基于Volley,Gson封装支持JWT无状态安全验证和数据防篡改的GsonRequest网络请求类
这段时间做新的Android项目的client和和REST API通讯框架架构设计.使用了非常多新技术,终于的方案也相当简洁优雅.client仅仅须要传Java对象,server端返回json字符串, ...
- block传值以及利用block封装一个网络请求类
1.block在俩个UIViewController间传值 近期刚学了几招block 的高级使用方法,事实上就是利用block语法在俩个UIViewController之间传值,在这里分享给刚開始学习 ...
- Xamarin.Android再体验之简单的登录Demo
一.前言 在空闲之余,学学新东西 二.服务端的代码编写与部署 这里采取的方式是MVC+EF返回Json数据,(本来是想用Nancy来实现的,想想电脑太卡就不开多个虚拟机了,用用IIS部署也好) 主要是 ...
- android 项目中使用到的网络请求框架以及怎样配置好接口URL
我们在做项目中一定少不了网络请求,如今非常多公司的网络请求这块好多都是使用一些比較好的开源框架,我项目中使用的是volley,如今讲讲一些volley主要的使用,假设想要具体的了解就要去看它的源代码了 ...
- 转:Android开源项目推荐之「网络请求哪家强」 Android开源项目推荐之「网络请求哪家强」
转载自https://zhuanlan.zhihu.com/p/21879931 1. 原则 本篇说的网络请求专指 http 请求,在选择一个框架之前,我个人有个习惯,就是我喜欢选择专注的库,其实在软 ...
- android开发学习 ------- Retrofit+Rxjava+MVP网络请求的实例
http://www.jianshu.com/p/7b839b7c5884 推荐 ,照着这个敲完 , 测试成功 , 推荐大家都去看一下 . 下面贴一下我照着这个敲完的代码: Book实体类 - 用 ...
- ios中封装网络请求类
#import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...
随机推荐
- CSS 重设文章
CSS 重设 http://blog.bingo929.com/css-reset-collection.html
- C#_基础,初始化器
对象初始化器 在没有对象初始化器之前,我们创建一个对象大概需要经过这么两个步骤,首先new一个对象,然后给每个字段赋值.而有了对象初始化器之后,原本需要几行代码才能完成的任务变成一行代码就可以完成,简 ...
- 使用libjpeg.framework压缩UIImage
+(void)writeFile:(NSString *)filePath withQuality:(int)quality { //初始化图片参数 UIImage *image=[UIImage i ...
- 使用Word2013发布博客
步骤一.新建博客文章 打开Word软件,新建->博客文章(第一次在模板下面可能找不到,可以在搜索栏中搜索"博客",下次在首页就能直接找到). 步骤二.编辑博客文章 1.输入文 ...
- .NET Core中遇到奇怪的线程死锁问题:内存与线程数不停地增长
一个 asp.net core 站点,之前运行在Linux 服务器上,运行一段时间后有时站点会挂掉,在日志中记录很多“EMFILE too many open files”的错误: Microsoft ...
- Javascript基础回顾 之(一) 类型
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
- MySQL 远程连接(federated存储引擎)
标签:federated存储引擎 概述 本文主要介绍通过federated存储引擎建立远程连接表 测试环境:mysql 5.6.21 步骤 开启federated存储引擎 先查看federated存储 ...
- I/O重定向的原理和实现
在Unix系统中,每个进程都有STDIN.STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式.几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从终端输入字符 ...
- 控制Linux下 mono 服务的启动停止
当Window下的服务部署到Linux的时候,我们一般用Mono.service 来启动停止.参数比较多,不太好用.于是有个这个Shell脚本. 用法:moa s1 start #启动 ...
- Android开发学习之路-Volley源码解析
从简单的StringRequest入手看看Volley的工作机制. 先简单说下Volley的用法: ① 获取一个RequestQueue mRequestQueue = Volley.newReque ...