.Net程序员安卓学习之路3:Post数据给网络API

简介: 原文:.Net程序员安卓学习之路3:Post数据给网络API本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson。 实现思路如: 1. 在API端接收客户POST的数据还原成对象,给每个属性加个后缀后输出; 2. 在客户端输入用户名和密码,用来和服务器端返回的进行对比; 我们POST给服务器的是name=mady&pwd=123,服务器分别加了后缀为name=madya &pwd=1231所以我们客户端需要输入madya和1231才能验证成功。
原文: .Net程序员安卓学习之路3:Post数据给网络API

本例我们实现一次真正的网络交互,将数据POST到API,然后接收服务器的返回值进行处理,同时引入自定义类型和传说中阿里的FastJson。

实现思路如:

1. 在API端接收客户POST的数据还原成对象,给每个属性加个后缀后输出;

2. 在客户端输入用户名和密码,用来和服务器端返回的进行对比;

我们POST给服务器的是name=mady&pwd=123,服务器分别加了后缀为name=madya

&pwd=1231所以我们客户端需要输入madya和1231才能验证成功。

具体操作展示如下:

wps3BD7.tmp

wps3BD8.tmp

一、准备API:

目前写API使用ASP.NET WEB API2再合适不过了。在VS2013中创建一个API项目,先配置他支持JSON:

打开项目中的WebApiConfig文件,在Register方法中加入一个配置项:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

创建实体类如:

    public class UserInfo
    {
        public string name { get; set; }
        public string pwd { get; set; }
    }

打开ValuesController修改代码如下:

        // POST api/values
        public UserInfo Post([FromBody]UserInfo value)
        {
            return new UserInfo { name = value.name + "a", pwd = value.pwd+"1" };
        }

就可以打开Fidder调试了,直到成功为止:

wps3BE9.tmp

 

二、引入阿里的FastJson包

直接右键粘贴进去即可:

wps3BFA.tmp

这个包真心好使:

String json=JSON.toJSONString(user);     //序列化 
UserInfo userInfo=JSON.parseObject(json,UserInfo.class);    //反序列化

就这2句话全部搞定。

我们继续,先新建一个Java的实体类:

import java.io.Serializable;

public class UserInfo implements Serializable{
private String name;
private String pwd;

public String getPwd() 
{
    return pwd;
}

public void setPwd(String pwd) 
{
    this.pwd = pwd;
}

public String getName() 
{
    return name;
}

public void setName(String name) 
{
    this.name = name;
}

}

然后修改网络访问类,上节那个太简陋了(见附)。

然后修改异步部分代码:

        protected String doInBackground(String... params)
        {
//            String citiesString ="{\"name\":\"mady\",\"pwd\":123}"; 
            UserInfo user=new UserInfo();
            user.setName("mady");
            user.setPwd("123");
            
            String str_json=JSON.toJSONString(user);  
            return HttpUtils.sendPostMessage(params[0],str_json);
        }

和完成代码:

        protected void onPostExecute(String result)
        {
            TextView lblInfo=(TextView)findViewById(R.id.form_title);
            EditText txt_login_name=(EditText)findViewById(R.id.txt_login_name);
            EditText txt_login_pass=(EditText)findViewById(R.id.txt_login_pwd);
            String loginName=txt_login_name.getText().toString().trim();
            String loginPass=txt_login_pass.getText().toString().trim();
            
            UserInfo userInfo=JSON.parseObject(result,UserInfo.class); 
            if(loginPass.equals(userInfo.getPwd())&&loginName.equals(userInfo.getName()))
            {
                lblInfo.setText("登录成功!");
            }
            else
            {
                lblInfo.setText("登录失败!");
            }
          }

到此完工,没有修改的就是没有变化的。

附上新网络访问类:

public class HttpUtils
{
    /**
     * @param path    请求的服务器URL地址
     * @param encode    编码格式
     * @return    将服务器端返回的数据转换成String
     */
    public static String sendPostMessage(String path,String jsonStr)
    {
        String result = "";
        HttpClient httpClient = new DefaultHttpClient();
        try
        {
            HttpPost httpPost = new HttpPost(path);
            httpPost.addHeader("content-type","text/json");

        httpPost.setEntity(new StringEntity(jsonStr));     
            HttpResponse httpResponse = httpClient.execute(httpPost);

            if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
            {
//                Log.e("Json+++++2:", jsonStr);    log info for debug
                HttpEntity httpEntity = httpResponse.getEntity();
                if(httpEntity != null)
                {
                    result = EntityUtils.toString(httpEntity, "UTF-8");
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            httpClient.getConnectionManager().shutdown();
        }
        
        return result;
    }
}

 

目录
相关文章
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
9 0
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
39 0
|
3月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
4月前
|
XML Java Android开发
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)
142 0
|
2天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
10天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android's AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
10 0
|
10天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
10 0
|
4月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
168 0
|
1月前
|
SQL 数据库
使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据
10 0