前面使用了一些網路上找來的類進行網路訪問,後來發現了安卓開發中有一個國人寫的類庫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" />
第二步:引入第三方Jar包:
分別在下面地址下載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中
第三步:實現網路GET方式訪問
服務中第一個方法如:
[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方式訪問
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簡化網路訪問。