这次应老板要求实现在设备端搭建一个webserver,供内网直接使用实现需要的业务逻辑。绝了!身为android应用开发竟然需要了解web服务器。在这之前先尝试了i-jetty,但还是不太利于android端的开发,所以于是有了这篇给大家介绍使用一个强大的Android端的Web服务器。
先说下应用场景
按照国际惯例,肯定要举个栗子!如同前言所说,其实这个web服务器的应用场景非常广而且方便。
1.如果企业内多台android设备需要一些系统配置,那么就需要管理员一一跑到设备前打开设置>填写参数>吧嗒吧嗒吧嗒....(繁琐)。那么如果每台设备提供这样一个可以远程操作直接配置的web界面呢!!
2.如果希望做一个单机版业务(场景较小,又不想要购置服务器),供内网直接使用操作。想象android设备就是个服务器,还可以直接办公pc登录web进行各种业务操作,体验就很好!!
是不是简单的两个例子,就能感受到好处了,其他什么局域网内下载上传的就先不说了!
快速入门使用
这里先给上AndServer开源项目,以及作者的详细介绍AndServer,一个Android端的web服务器,感谢作者的无私分享~~这里参考AndServer开发文档更有帮助
1.Sample
开源项目内自带了一实现用户登录的例子,通过表单请求服务器验证用户和密码返回结果。
结合开发手册可直接清晰明地了解其中的使用方法。
这里设备端也就是服务器的ip地址是192.168.1.48,应用端口默认8080。
2.基于Sample修改的房间展板案例
需求场景:在Android房间展板屏上搭建一个AndServer
1.自定义web端界面(当然是要拜托前端同事)
2.web端支持获取展板状态,和展板名称等属性
3.web端支持修改展板名称等属性
简单这实现三点,不过这三点也差不多能符合大部分情况了。
数据库
数据库当然是必须的,这里使用的是GreenDao,关于android的GreenDao可自行查阅。
build后的实体类如下:
import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Generated;
import org.greenrobot.greendao.annotation.Id;
@Entity
public class DaoRoom {
@Id(autoincrement = true)
private Long id;
//房间名称
private String roomName;
//容纳人数
private Integer number;
//房间设备
private String equipment;
@Generated(hash = 800482737)
public DaoRoom(Long id, String roomName, Integer number, String equipment) {
this.id = id;
this.roomName = roomName;
this.number = number;
this.equipment = equipment;
}
@Generated(hash = 332995214)
public DaoRoom() {
}
public String getRoomName() {
return this.roomName;
}
public void setRoomName(String roomName) {
this.roomName = roomName;
}
public Integer getNumber() {
return this.number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getEquipment() {
return this.equipment;
}
public void setEquipment(String equipment) {
this.equipment = equipment;
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
}
提供web端http api接口
这里就要介绍到AndServer的好用之处了,RequestMapping。
它可以规定一个Http Api请求路径、请求方法、参数校验、请求头校验、Accept、ContentType等重要规则。
代码如下:
import com.yanzhenjie.andserver.annotation.GetMapping;
import com.yanzhenjie.andserver.annotation.PathVariable;
import com.yanzhenjie.andserver.annotation.PostMapping;
import com.yanzhenjie.andserver.annotation.RequestBody;
import com.yanzhenjie.andserver.annotation.RequestMapping;
import com.yanzhenjie.andserver.annotation.RestController;
import com.yanzhenjie.andserver.http.HttpRequest;
import com.yanzhenjie.andserver.http.HttpResponse;
import com.yanzhenjie.andserver.sample.greendao.DaoUtil;
import com.yanzhenjie.andserver.sample.model.ResponseBean;
import com.yanzhenjie.andserver.sample.util.JsonUtils;
import com.yanzhenjie.andserver.sample.util.Logger;
import com.yanzhenjie.andserver.util.MediaType;
@RestController
@RequestMapping(path = "/room")
public class RoomController {
/**
* 查询房间信息
* @return
*/
@GetMapping(path = "/info")
ResponseBean info() {
return DaoUtil.getRoomInfo();
}
/**
* 更新房间信息
* @param request
* @param response
* @param jsonStr
* @return
*/
@PostMapping(path = "/update",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
ResponseBean booking(HttpRequest request, HttpResponse response, @RequestBody String jsonStr){
Logger.i("Body:"+JsonUtils.toJsonString(request.getBody()));
return DaoUtil.updateRoomInfo(jsonStr);
}
}
类上可直接添加@RequestMapping(path = "/room")简化。路径依次为/room/info和/room/update,json通信,主要提供了GET房间属性和POST更新房间属性两条。路径
这里的ResponseBean类和DaoUtil数据库操作工具可自行封装修改。
当然要验证接口了。这里因为只实现个单页面demo,所以没有对PageController做修改。
替换我们的Website
AndServer提供了AssetsWebsite、StorageWebsite、FileBrowser,从名称也能看出来,StorageWebsite需要指定web原文件在设备中的存储路径,好处是可以方便更换。这里应场景使用的AssetsWebsite,可直接原文件替换sample内的assets文件。
如图所示:
结果
流程很简单,但是这个思路已经可以做很多事情了!