1. 程式人生 > >基於Netty實現的RESTful框架--netty-rest-server

基於Netty實現的RESTful框架--netty-rest-server

nts -c short HR 使用 攔截器 turn pub path

在工作中用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<User> 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();
        }
    }

源碼與實例程序

典型應用

基於Netty實現的RESTful框架--netty-rest-server