.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;
    }
}

 

目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1512 4
|
7月前
|
人工智能 API 数据库
Semantic Kernel .NET 架构学习指南
本指南系统解析微软Semantic Kernel .NET架构,涵盖核心组件、设计模式与源码结构,结合实战路径与调试技巧,助你从入门到贡献开源,掌握AI编排开发全栈技能。
699 2
|
10月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
615 11
|
11月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
12月前
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
2732 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
923 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
人工智能 JSON 自然语言处理
AI 程序员的4个分身 | 代码生成专家+注释精灵+API集成助手+智能调试伙伴
AI 程序员的4个分身 | 代码生成专家+注释精灵+API集成助手+智能调试伙伴
549 35
|
机器学习/深度学习 编解码 计算机视觉
RT-DETR改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合
RT-DETR改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合
770 10
RT-DETR改进策略【Backbone/主干网络】| 2023 U-Net V2 替换骨干网络,加强细节特征的提取和融合