几十行代码基于Netty搭建一个 HTTP Server( 六 )


实际上 , 获得了 URI 的查询参数的对应关系 , 再结合反射和注解相关的知识 , 我们很容易实现类似于 Spring Boot 的 @RequestParam 注解了 。
建议想要学习的小伙伴 , 可以自己独立实现一下 。 不知道如何实现的话 , 你可以参考我开源的轻量级 HTTP 框架jsoncat (仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架) 。
POST 请求的处理@Slf4jpublic class PostRequestHandler implements RequestHandler {@Overridepublic Object handle(FullHttpRequest fullHttpRequest) {String requestUri = fullHttpRequest.uri();log.info("request uri :[{}]", requestUri);String contentType = this.getContentType(fullHttpRequest.headers());if (contentType.equals("application/json")) {return fullHttpRequest.content().toString(Charsets.toCharset(CharEncoding.UTF_8));} else {throw new IllegalArgumentException("only receive application/json type data");}}private String getContentType(HttpHeaders headers) {String typeStr = headers.get("Content-Type");String[] list = typeStr.split(";");return list[0];}}对于 POST 请求的处理 , 我们这里只接受处理 Content-Type 为 application/json 的数据 , 如果 POST 请求传过来的不是 application/json 类型的数据 , 我们就直接抛出异常 。
实际上 , 我们获得了客户端传来的 json 格式的数据之后 , 再结合反射和注解相关的知识 , 我们很容易实现类似于 Spring Boot 的 @RequestBody 注解了 。
建议想要学习的小伙伴 , 可以自己独立实现一下 。 不知道如何实现的话 , 你可以参考我开源的轻量级 HTTP 框架jsoncat (仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架) 。
请求处理工厂类public class RequestHandlerFactory {public static final Map REQUEST_HANDLERS = new HashMap<>();static {REQUEST_HANDLERS.put(HttpMethod.GET, new GetRequestHandler());REQUEST_HANDLERS.put(HttpMethod.POST, new PostRequestHandler());}public static RequestHandler create(HttpMethod httpMethod) {return REQUEST_HANDLERS.get(httpMethod);}}我这里用到了工厂模式 , 当我们额外处理新的 HTTP Method 方法的时候 , 直接实现 RequestHandler 接口 , 然后将实现类添加到 RequestHandlerFactory 即可 。
启动类public class HttpServerApplication {public static void main(String[] args) {HttpServer httpServer = new HttpServer();httpServer.start();}}效果运行 HttpServerApplicationmain()方法 , 控制台打印出:
[nioEventLoopGroup-2-1] INFO io.netty.handler.logging.LoggingHandler - [id: 0x9bb1012a] REGISTERED[nioEventLoopGroup-2-1] INFO io.netty.handler.logging.LoggingHandler - [id: 0x9bb1012a] BIND: 0.0.0.0/0.0.0.0:8080[nioEventLoopGroup-2-1] INFO io.netty.handler.logging.LoggingHandler - [id: 0x9bb1012a, L:/0:0:0:0:0:0:0:0:8080] ACTIVE[main] INFO server.HttpServer - Netty Http Server started on port 8080.GET 请求
几十行代码基于Netty搭建一个 HTTP Server文章插图
POST 请求
几十行代码基于Netty搭建一个 HTTP Server文章插图


推荐阅读