一、基本概念与通信方式
通信方式
Android客户端与服务器之间的通信主要通过HTTP和Socket两种方式实现,HTTP是基于请求—响应模式的协议,适用于不需要时刻保持连接的场景,如客户端资源的获取、文件上传等,而Socket则提供了更低层次的通信能力,通过建立socket连接,双方可以开始持续的数据交换,适用于需要实时通讯的应用,比如即时通讯工具(如QQ、微信)、聊天室等。
1.1 HTTP通信
HTTP通信采用“请求—响应”的方式,即客户端向服务器发送一条HTTP请求,服务器收到请求后解析并返回数据给客户端,然后客户端再对这些数据进行解析和处理,HTTP基于TCP协议,保证了数据传输的可靠性。
1.2 Socket通信
Socket通信在程序内部提供了与外界通信的端口,通过建立socket连接,可为通信双方提供数据传输通道,Socket的主要特点包括数据丢失率低、使用简单且易于移植,它类似于peer to peer的连接,一方可以随时向另一方发送数据。
数据交互方式
Android客户端与服务器的数据交互方式主要有以下几种:
2.1 数据流
从web服务器响应到手机终端的数据一般打包在一个字节数组中,客户端采取Java数据流和过滤流的方式从字节数组中取出各种类型的数据,这种方式扩展了Android平台在访问Web服务器进行交互时的解析数据能力,但在实际项目中应用较少。
2.2 XML
XML是WebService的标准数据格式,具有良好的可读性和跨平台性,但数据量较大,传输效率相对较低。
2.3 Protocol Buffers
Protocol Buffers是一种轻便高效的结构化数据存储格式,支持跨平台,适合做数据存储或RPC数据交换格式,其最大优点是传输时数据体积可以压缩得很小,传输效率高。
2.4 JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,它是目前最常用于Android客户端与服务器交互的数据格式。
二、RESTful API的使用
RESTful API简介
RESTful是目前最流行的API设计规范,用于Web数据接口的设计,其核心原则是面向资源(URI),行为(GET / POST / PUT / PATCH / DELETE)与资源(URI)分离,更轻量级;数据描述简单,使用JSON、XML、Protocol Buffers即可全覆盖,主要使用JSON。
HTTP请求方式
GET:读取(Read)
POST:新建(Create)
PUT:更新(Update),通常是全部更新
PATCH:更新(Update),通常是部分更新
DELETE:删除(Delete)
项目搭建初期,客户端和服务器一般用GET和POST方式进行交互,随着业务演进和技术规范迭代,后期会采用上述五种方式来设计服务器接口,相应地,移动端的请求方式也得与之对应。
三、JSON数据交互实际应用
JSON数据类型
JSON的值只有六种数据类型:
Number:整数或浮点数
String:字符串
Boolean:true 或 false
Array:数组包含在方括号[]中
Object:对象包含在大括号{}中
Null:空类型
需要注意的是,传输的数据类型不能超过这六种,不能用Date数据类型,不同的解析库解析方式不同,可能会导致异常,如果遇到日期的数据,最好的方式就是使用毫秒数表示日期。
String数据类型
使用场景:如用户退出登录时,只需要得到返回状态和提示信息即可,不需要返回任何数据。
{ "code": 1000, "message": "成功" }
数据解析工具类:
abstract class BaseStringCallback: BaseCallback() { override fun onSuccess(data: String) { val responseData = JSONObject(data) val code = responseData.getInt("code") val message = responseData.getString("message") if (code == 1000) { success(message) } else { //其他状态 } } abstract fun success(msg: String) }
调用时(伪代码):
LogoutApi.execute(object : BaseStringCallback() { override fun success(msg: String) { //处理数据 } })
Object数据类型
识别标示为:{}
使用场景:如获取当前用户信息,返回owner实体类,这个类我们可以直接用Gson的工具类转换为owner实体类。
{ "code": 1000, "message": "成功", "resp": { "owner": { "id": 58180, "name": "张三", "idCert": "", "certType": 1, "modifier": "jun5753", } } }
数据解析工具类:
class GsonUtils { static fun <T> fromJson(json: String, clazz: Class<T>): T? { return try { Gson().fromJson(json, clazz) } catch (e: Exception) { null } } }
调用时(伪代码):
val result = GsonUtils.fromJson(response, Owner::class.java) if (result != null) { //处理数据 }
四、实际案例分析:登录功能实现
服务器端实现
服务器端接收客户端发送的账号和密码,查询数据库判断是否能登录成功,然后返回JSON字符串给客户端,服务器端可以使用SpringBoot+Mybatis-Plus快速搭建。
@PostMapping("/login") public Map<String, Object> login(@RequestBody User user) { Map<String, Object> map = new HashMap<>(); if(userMapper.selectOne(new QueryWrapper<>(user)) != null){ map.put("msg","登录成功"); }else { map.put("msg","账号或密码错误"); } return map; }
Android客户端实现
Android客户端输入账号和密码,使用OkHttp向服务器端发送请求并传递输入的账号和密码,服务器端的登录接口查询数据库,判断是否能登录成功,然后返回给客户端JSON字符串,客户端使用Gson解析服务器返回的数据,做出不同的操作。
private void login(String name, String pwd, MyCallBack myCallBack) { RequestParams params = new RequestParams(); params.add("name", name); params.add("pwd", pwd); x.post("http://192.168.31.220:8080/AndroidServer/app/login", params, new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { // success //处理返回结果 L.d("tag", "result===" + result); //{"code":1000,"message":"登录成功"} try { JSONObject object = new JSONObject(result); int code = object.getInt("code"); String msg = object.getString("message"); myCallBack.onSuccess(code, msg); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(Throwable ex, boolean isOnCallback) { // failure //请求失败处理 ex.printStackTrace(); myCallBack.onError("请求失败"); } }); }
以上就是关于“android客户端和服务器交互”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1291666.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复