博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java+Netty实现的RESTful框架--netty-rest-server
阅读量:5947 次
发布时间:2019-06-19

本文共 3315 字,大约阅读时间需要 11 分钟。

在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架。

该框架提供了控制器注解、全局异常控制器、拦截器等功能。

注解名称参考了Spring MVC,编译理解和记忆,主要包括如下注解:

  • @RestController
  • @RequestMapping
  • @GetMapping
  • @PostMapping
  • @DeleteMapping
  • @PutMapping
  • @PatchMapping
  • @JsonResponse
  • @RequestParam
  • @PathVariable
  • @RequestBody
  • @UploadFile
  • @UrlEncodedForm
  • @RequestHeader

Controller示例:

//默认为单例,singleton = false表示启用多例。//@RestController(singleton = false)@RestController@RequestMapping("/users")public class UserController {        @GetMapping("")    @JsonResponse    public ResponseEntity
listUser() { // 查询用户 User user = new User(); user.setId(1); user.setName("Leo"); user.setAge((short)18); return ResponseEntity.ok().build(user); } @PutMapping("/{id}") public ResponseEntity
putMethod(@PathVariable("id") int id, @RequestBody String body) { // 更新用户 return ResponseEntity.status(HttpStatus.CREATED).build(); } @DeleteMapping("/{id}") public ResponseEntity
deleteMethod(@PathVariable int id) { // 删除用户 return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } @PostMapping("") public ResponseEntity
postMethod(@RequestBody String body) { // 添加用户 JSONObject json = JSONObject.parseObject(body); User user = new User(); user.setId(json.getIntValue("id")); user.setName(json.getString("name")); user.setAge(json.getShortValue("age")); return ResponseEntity.status(HttpStatus.CREATED).build(user); }}

拦截器示例:

public final class CorsInterceptor implements Interceptor {    @Override    public boolean preHandle(FullHttpRequest request, HttpResponse response) throws Exception {        // 使用axios发送cookie,这里不能用*,需要使用Web前端地址,如:http://localhost:8080        // response.getHeaders().put("Access-Control-Allow-Origin", "*");        response.getHeaders().put("Access-Control-Allow-Origin", System.getProperty("http.origin"));        response.getHeaders().put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");        response.getHeaders().put("Access-Control-Max-Age", "3600");        response.getHeaders().put("Access-Control-Allow-Headers", "Content-Type,X-Token");        response.getHeaders().put("Access-Control-Allow-Credentials", "true");        return true;    }    @Override    public void postHandle(FullHttpRequest request, HttpResponse response) throws Exception {    }    @Override    public void afterCompletion(FullHttpRequest request, HttpResponse response) {    }}

启动服务:

@Test    public void test() {        // 忽略指定url        WebServer.getIgnoreUrls().add("/favicon.ico");                // 全局异常处理        WebServer.setExceptionHandler(new ExceptionController());                // 设置监听端口号        WebServer server = new WebServer(2006);                // 设置Http最大内容长度(默认 为10M)        server.setMaxContentLength(1024 * 1024 * 50);                // 设置Controller所在包        server.setControllerBasePackage("org.leo.web.controller");                // 添加拦截器,按照添加的顺序执行。        // 跨域拦截器        server.addInterceptor(new CorsInterceptor(), "/不用拦截的url");                try {            server.start();        } catch (InterruptedException e) {            e.printStackTrace();        }    }

测试服务

:2006/users

转载地址:http://chbxx.baihongyu.com/

你可能感兴趣的文章
蓝桥杯 基础练习 十六进制转十进制(水题,进制转换)
查看>>
php有些系统会报错或提示 Cannot modify header information - headers already sent by
查看>>
从零開始开发Android版2048 (五) 撤销的实现
查看>>
OpenGL 4 : 一个漂亮的心 For you, My Love
查看>>
2007年硕士研究生面试时的英文自我介绍
查看>>
POJ1789:Truck History(Prim算法)
查看>>
SD卡
查看>>
使用servletAPI三种方式简单示例
查看>>
单片机不同晶振怎么计算延迟时间?
查看>>
视频会议十大开源项目排行
查看>>
SQL Server Management Studio 简单使用说明
查看>>
【前端】javascript判断undefined、null、NaN;字符串包含等
查看>>
玩转iOS开发 - 数据缓存
查看>>
李洪强-C语言3-数组
查看>>
C# 6.0的字典(Dictionary)的语法
查看>>
使用ShareSDK实现第三方授权登录、分享以及获取用户资料效果,项目中包含:源码+效果图+项目结构图...
查看>>
三级联动效果
查看>>
Sprite和UI Image的区别
查看>>
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql/mysql.sock' (2)
查看>>
python练习笔记——丑数的计算
查看>>