前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录。
本例服务端使用WCF来实现,写好的WCF服务端在:http://www.cnblogs.com/madyina/p/3454741.html 下载部署即可
该服务说明如下:
这4个公开方法均返回一个User对象,其中最后一个还接收一个User对象。
下面我们就分别请求这4个资源。
使用相对布局,放置2个按钮,分别为【Get Test】和【Post Test】。
布局代码如:
<Button android:id="@+id/btn_get" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Get Test" android:onClick="btn_getTest" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@+id/btn_get" android:text="Post Test" android:onClick="btn_postTest" />
分别在下面地址下载xutils包和FastJson包:
https://github.com/wyouflf/xUtils/blob/master/xUtils-2.6.14.jar
http://repo1.maven.org/maven2/com/alibaba/fastjson/
复制到eclipse中。
不过这个FastJson包真心有点太大了,希望能够精简一些。
然后加入网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
在bin\AndroidManifest.xml中
服务中第一个方法如:
[OperationContract] [WebInvoke(UriTemplate = "GetPerson", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "GET")] public User GetUser() { return new User { Age = "12", ID = "001", Name = "zhangsan" }; }
所以使用
http://192.168.1.6/UserService.svc/GetPerson 来进行访问,如果访问成功,服务会返回一个Json串
我们要做的就是将返回的Json串反序列化成对象,再访问对象的属性。
Xutils为我们封装并优化了Android网络访问,所以现在写访问代码较为轻松:
public void btn_getTest(View v) { HttpUtils http = new HttpUtils(); String url = "http://192.168.1.6/UserService.svc/GetPerson"; RequestParams params = new RequestParams(); http.send(HttpMethod.GET, url, params, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { User userInfo=JSON.parseObject(responseInfo.result,User.class); Toast.makeText(getApplicationContext(), "请求结果:" + userInfo.getName(), Toast.LENGTH_SHORT).show(); } @Override public void onFailure(HttpException error, String msg) { Toast.makeText(getApplicationContext(), "访问失败" + msg, Toast.LENGTH_SHORT).show(); } }); }
发送到虚拟机运行效果如:
Get方式若要加参数只需加在Url中即可,所以第二个方法不再举例。
POST方式无参情况较少,我们直接来看有BODY的情况。实现思路是将本地对象序列化成JSON串,POST给服务,将返回的数据再次反序列化,如上例show出对象的属性。
服务方法如:
[OperationContract] [WebInvoke(UriTemplate = "GetPersonPostById", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, Method = "POST")] public User GetUserPostById(User u) { return new User { Age = "15", ID = "005", Name = "laoliu" }; }
本次不同的是由于传送的BODY格式是JSON格式,所以需要在POST请求中加入Content-Type,详细代码如下:
public void btn_postTest(View v) { HttpUtils http = new HttpUtils(); String url = "http://192.168.1.6/UserService.svc/GetPersonPostById"; RequestParams params = new RequestParams(); /* //添加请求参数 params.addBodyParameter(key, value);*/ params.addHeader("Content-Type", "application/json"); User user=new User(); user.setName("mady"); user.setAge("1"); user.setID("123"); String jsonStr=JSON.toJSONString(user); try { params.setBodyEntity(new StringEntity(jsonStr)); } catch (UnsupportedEncodingException e) { } http.send(HttpMethod.POST, url, params, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { User userInfo=JSON.parseObject(responseInfo.result,User.class); Toast.makeText(getApplicationContext(), "请求结果:" + userInfo.getName(), Toast.LENGTH_SHORT).show(); } @Override public void onFailure(HttpException error, String msg) { Toast.makeText(getApplicationContext(), "访问失败" + error.fillInStackTrace(), Toast.LENGTH_SHORT).show(); } }); }
发送到虚拟机运行效果如:
如此我们就完成了使用xutils简化网络访问。