AndServer 是 Android
平台的 Web Server
和 Web Framework
。 它基于编译时注解提供了类似 SpringMVC
的注解和功能,如果您熟悉 SpringMVC
,则可以非常快速地掌握它。
- 源码地址:https://github.com/yanzhenjie/AndServer/
- 文档地址:https://yanzhenjie.github.io/AndServer/
- 旧版文档:https://yanzhenjie.github.io/AndServer/1.x/
引用
- project build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.yanzhenjie.andserver:plugin:2.1.10'
...
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
- module build.gradle
plugins {
id 'com.android.application'
id 'com.yanzhenjie.andserver'
}
...
dependencies {
implementation 'com.yanzhenjie.andserver:api:2.1.10'
annotationProcessor 'com.yanzhenjie.andserver:processor:2.1.10'
...
}
部署
AndServer 提供启动、停止、网络地址与端口监听、连接超时配置、SSL、状态监听、Socket 的一些优化配置等
Server mServer= AndServer.webServer(context)
.port(8080)
.timeout(10, TimeUnit.SECONDS)
.build();
/**
* Start server.
*/
public void startServer() {
if (mServer.isRunning()) {
// TODO The server is already up.
} else {
// startup the server.
mServer.startup();
}
}
/**
* Stop server.
*/
public void stopServer() {
if (mServer.isRunning()) {
// shutdown the server.
mServer.shutdown();
} else {
Log.w("AndServer", "The server has not started yet.");
}
}
使用
- 返回String
@RestController
public class UserController {
@GetMapping("/user/info")
String getAccount(@RequestParam("account") String account,HttpRequest request,HttpResponse response) {
if("123".equals(account)) {
response.setStatus(200);
return "123 Login";
} else {
response.setStatus(400);
return "Login failed.";
}
}
@PostMapping("/user/login")
String login(@RequestParam("account") String account,
@RequestParam("password") String password) {
if("123".equals(account) && "123".equals(password)) {
return "Login successful.";
} else {
return "Login failed.";
}
}
}
- 返回Json
@RestController
public class UserController {
/**
* Get user information.
*/
@GetMapping("/user/info")
String userList(@RequestParam("id") String id) {
User user = new User();
user.setId(id);
user.setName("AndServer");
return JSON.toJSONString(user);
}
/**
* Get user list.
*/
@GetMapping("/user/get")
JSONObject userList() {
JSONObject jsonObj = ...;
return jsonObj;
}
}
- MultipartFile
// 单个文件
@PostMapping(path = "/upload")
void upload(@RequestParam(name = "file") MultipartFile file) throws IOException {
String fileName = file.getName();
log( "/upload", fileName);
}
//多个文件
@PostMapping(path = "/file/uploadMore")
String uploadMoreFile(HttpRequest request,HttpResponse response) throws IOException {
StandardMultipartRequest standardMultipartRequest = (StandardMultipartRequest)request;
Map files = standardMultipartRequest.getFileMap();
Map saveFile = writeFile(files);
return "OK";
}
//保存转移文件
private Map writeFile(Map fileMap){
Map saveFileInfo = new HashMap<>();
for (String s: fileMap.keySet()) {
MultipartFile f = fileMap.get(s);
log("/writeFile", s +", "+ f.getFilename());
try {
f.transferTo(new File(Cons.getPath(f.getFilename())));
saveFileInfo.put(s, f.getFilename());
} catch (IOException e) {
e.printStackTrace();
}
}
return saveFileInfo;
}
疑问点是,按照文件,在 Config 中配置了 文件保存目录,但是
.uploadTempDir(new File(context.getCacheDir(), "_server_upload_cache_")) // 文件保存目录
配置的保存路径下,没有保存收到的文件,所以只能使用transferTo(File),转移该文件到目标位置
来转移文件了
文档这样写,还蛮疑惑的
@Config
public class AppConfig implements WebConfig {
@Override
public void onConfig(Context context, Delegate delegate) {
// 增加一个静态网站
delegate.addWebsite(new AssetsWebsite(context, "/web"));
// 自定义配置表单请求和文件上传的条件
delegate.setMultipart(Multipart.newBuilder()
.allFileMaxSize(1024 * 1024 * 20) // 单个请求上传文件总大小
.fileMaxSize(1024 * 1024 * 5) // 单个文件的最大大小
.maxInMemorySize(1024 * 10) // 保存上传文件时buffer大小
.uploadTempDir(new File(context.getCacheDir(), "_server_upload_cache_")) // 文件保存目录
.build());
}
}