基於Netty實現的RESTful框架--netty-rest-server
阿新 • • 發佈:2018-06-19
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