资讯专栏INFORMATION COLUMN

Java+Netty实现的RESTful框架--netty-rest-server

sixgo / 2120人阅读

摘要:在工作中用做了几个服务,感觉做出来的程序性能好,资源占用少,但是实现服务比较麻烦,于是就参考的注解基于实现了一个轻量级的框架。该框架提供了控制器注解全局异常控制器拦截器等功能。跨域拦截器不用拦截的测试服务源码与实例程序典型应用

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

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

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

@RestController

@RequestMapping

@GetMapping

@PostMapping

@DeleteMapping

@PutMapping

@PatchMapping

@JsonResponse

@RequestParam

@PathVariable

@RequestBody

@UploadFile

@UrlEncodedForm

@RequestHeader

Controller示例:

</>复制代码

  1. //默认为单例,singleton = false表示启用多例。
  2. //@RestController(singleton = false)
  3. @RestController
  4. @RequestMapping("/users")
  5. public class UserController {
  6. @GetMapping("")
  7. @JsonResponse
  8. public ResponseEntity listUser() {
  9. // 查询用户
  10. User user = new User();
  11. user.setId(1);
  12. user.setName("Leo");
  13. user.setAge((short)18);
  14. return ResponseEntity.ok().build(user);
  15. }
  16. @PutMapping("/{id}")
  17. public ResponseEntity putMethod(@PathVariable("id") int id, @RequestBody String body) {
  18. // 更新用户
  19. return ResponseEntity.status(HttpStatus.CREATED).build();
  20. }
  21. @DeleteMapping("/{id}")
  22. public ResponseEntity deleteMethod(@PathVariable int id) {
  23. // 删除用户
  24. return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
  25. }
  26. @PostMapping("")
  27. public ResponseEntity postMethod(@RequestBody String body) {
  28. // 添加用户
  29. JSONObject json = JSONObject.parseObject(body);
  30. User user = new User();
  31. user.setId(json.getIntValue("id"));
  32. user.setName(json.getString("name"));
  33. user.setAge(json.getShortValue("age"));
  34. return ResponseEntity.status(HttpStatus.CREATED).build(user);
  35. }
  36. }
拦截器示例:

</>复制代码

  1. public final class CorsInterceptor implements Interceptor {
  2. @Override
  3. public boolean preHandle(FullHttpRequest request, HttpResponse response) throws Exception {
  4. // 使用axios发送cookie,这里不能用*,需要使用Web前端地址,如:http://localhost:8080
  5. // response.getHeaders().put("Access-Control-Allow-Origin", "*");
  6. response.getHeaders().put("Access-Control-Allow-Origin", System.getProperty("http.origin"));
  7. response.getHeaders().put("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE, PATCH");
  8. response.getHeaders().put("Access-Control-Max-Age", "3600");
  9. response.getHeaders().put("Access-Control-Allow-Headers", "Content-Type,X-Token");
  10. response.getHeaders().put("Access-Control-Allow-Credentials", "true");
  11. return true;
  12. }
  13. @Override
  14. public void postHandle(FullHttpRequest request, HttpResponse response) throws Exception {
  15. }
  16. @Override
  17. public void afterCompletion(FullHttpRequest request, HttpResponse response) {
  18. }
  19. }
启动服务:

</>复制代码

  1. @Test
  2. public void test() {
  3. // 忽略指定url
  4. WebServer.getIgnoreUrls().add("/favicon.ico");
  5. // 全局异常处理
  6. WebServer.setExceptionHandler(new ExceptionController());
  7. // 设置监听端口号
  8. WebServer server = new WebServer(2006);
  9. // 设置Http最大内容长度(默认 为10M)
  10. server.setMaxContentLength(1024 * 1024 * 50);
  11. // 设置Controller所在包
  12. server.setControllerBasePackage("org.leo.web.controller");
  13. // 添加拦截器,按照添加的顺序执行。
  14. // 跨域拦截器
  15. server.addInterceptor(new CorsInterceptor(), "/不用拦截的url");
  16. try {
  17. server.start();
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. }
测试服务

http://localhost:2006/users

源码与实例程序

典型应用

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71256.html

相关文章

  • Java+Netty、Vue+Element-UI实现即时通信应用 leo-im

    摘要:服务和服务之间的解耦和通讯可使用内置的队列或发布订阅实现,消息处理器接收到任务后,会将该任务交由线程池处理,处理后通过发送广播或发给指定的。前端基于开发,建议使用浏览器体验。在线体验测试用户,口令均为源码地址服务端端 之前工作接触了几个开源的IM产品,再加上曾经用Netty实现过几个服务,于是就有了用Netty实现一个IM的想法,于是用业余时间写了一个IM,和喜欢Netty的程序员们分...

    zhaofeihao 评论0 收藏0
  • PHP 进阶之路 - 后端多元化之快速切入 Java 开发

    摘要:以实现自己熟悉的东西为导向比如我们做后端开发,首先是常用的循环迭代条件判断增删改成。它是由实现的,不保证元素的顺序,也就是说所说元素插入的顺序与输出的顺序不一致。 下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...代码:https://github.com/zhoumengka...整个项目我们我又细分了6个版本来演进,希望更加便于大家对比...

    Cristic 评论0 收藏0
  • PHP 进阶之路 - 后端多元化之快速切入 Java 开发

    摘要:以实现自己熟悉的东西为导向比如我们做后端开发,首先是常用的循环迭代条件判断增删改成。它是由实现的,不保证元素的顺序,也就是说所说元素插入的顺序与输出的顺序不一致。 下面是我直播的文字版,直播地址:https://segmentfault.com/l/15...代码:https://github.com/zhoumengka...整个项目我们我又细分了6个版本来演进,希望更加便于大家对比...

    xi4oh4o 评论0 收藏0
  • Java面试通关要点汇总集

    摘要:本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答。敬请关注服务端思维微信公众号,获取最新文章。 原文地址:梁桂钊的博客博客地址:http://blog.720ui.com 这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术。本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进...

    gougoujiang 评论0 收藏0
  • 后端经验

    摘要:在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁入队服务教程在它提出十多年后的今天,已经成为最重要的应用技术之一。随着编程经验的日积月累,越来越感觉到了解虚拟机相关要领的重要性。 JVM 源码分析之 Jstat 工具原理完全解读 http://click.aliyun.com/m/8315/ JVM 源码分析之 Jstat 工具原理完全解读 http:...

    i_garfileo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<