• .Net程序员安卓学习之路4:使用xutils Get Post数据


    前面使用了一些网络上找来的类进行网络访问,后来发现了安卓开发中有一个国人写的类库xutils比较全面,也比较经典,故后续使用xutils类库进行记录。

    本例服务端使用WCF来实现,写好的WCF服务端在:http://www.cnblogs.com/madyina/p/3454741.html 下载部署即可

    该服务说明如下:

    image

    这4个公开方法均返回一个User对象,其中最后一个还接收一个User对象。

    下面我们就分别请求这4个资源。

    第一步:实现界面

    使用相对布局,放置2个按钮,分别为【Get Test】和【Post Test】。

    image

    布局代码如:

           <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"/>

    在binAndroidManifest.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串

    image

    我们要做的就是将返回的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(); 
            } 
    
            });
        }

    发送到虚拟机运行效果如:

    image

    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(); 
            } 
    
            }); 
        }

    发送到虚拟机运行效果如:

    image

    如此我们就完成了使用xutils简化网络访问。

  • 相关阅读:
    js中常见的异步操作有哪些?
    z-index
    transition和animation的区别?
    JS 中遇到有特殊字符或者空格时会被转译该怎么办?
    url参数中有+、空格、=、%、&、#等特殊符号无法显示怎么办?
    JS如何删除对象中的某一属性?
    splice和slice、map和forEach、 filter()、reduce()的区别
    css呼吸灯效果
    mescroll—移动端精致的下拉刷新和上拉加载js框架(支持Vue)
    血淋淋的教训—将Vue项目打包成app的跨域问题
  • 原文地址:https://www.cnblogs.com/madyina/p/4300090.html
Copyright © 2020-2023  润新知