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

我们返回给客户端的消息体是 FullHttpResponse 对象 。 通过 FullHttpResponse 对象 , 我们可以设置 HTTP 响应报文的 HTTP 协议版本、响应的具体内容 等内容 。
我们可以把 FullHttpResponse 对象看作是 HTTP 响应报文的 Java 对象的表现形式 。
FullHttpResponse response;String responseHtml = "" + result + "";byte[] responseBytes = responseHtml.getBytes(StandardCharsets.UTF_8);// 初始化 FullHttpResponse, 并设置 HTTP 协议 、响应状态码、响应的具体内容response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(responseBytes));我们通过 FullHttpResponseheaders()方法获取到 HttpHeaders,这里的 HttpHeaders 对应于 HTTP 响应报文的头部 。 通过 HttpHeaders对象 , 我们就可以对 HTTP 响应报文的头部的内容比如 Content-Typ 进行设置 。
response.headers().set(CONTENT_TYPE, "text/html; charset=utf-8");response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());本案例中 , 为了掩饰我们设置的 Content-Type 为 text/html, 也就是返回 html 格式的数据给客户端 。
常见的 Content-Type
Content-Type解释text/htmlhtml 格式text/plain纯文本格式text/csscss 格式text/javascriptjs 格式application/jsonjson 格式(前后端分离项目常用)image/gifgif 图片格式image/jpegjpg 图片格式image/pngpng 图片格式请求的具体处理逻辑实现因为有这里有 POST 请求和 GET 请求 。 因此我们需要首先定义一个处理 HTTP Request 的接口 。
public interface RequestHandler {Object handle(FullHttpRequest fullHttpRequest);}HTTP Method 不只是有 GET 和 POST , 其他常见的还有 PUT、DELETE、PATCH 。 只是本案例中实现的 HTTP Server 只考虑了 GET 和 POST 。

  • GET :请求从服务器获取特定资源 。 举个例子:GET /classes(获取所有班级)
  • POST :在服务器上创建一个新的资源 。 举个例子:POST /classes(创建班级)
  • PUT :更新服务器上的资源(客户端提供更新后的整个资源) 。 举个例子:PUT /classes/12(更新编号为 12 的班级)
  • DELETE :从服务器删除特定的资源 。 举个例子:DELETE /classes/12(删除编号为 12 的班级)
  • PATCH :更新服务器上的资源(客户端提供更改的属性 , 可以看做作是部分更新) , 使用的比较少 , 这里就不举例子了 。
GET 请求的处理@Slf4jpublic class GetRequestHandler implements RequestHandler {@Overridepublic Object handle(FullHttpRequest fullHttpRequest) {String requestUri = fullHttpRequest.uri();Map queryParameterMappings = this.getQueryParams(requestUri);return queryParameterMappings.toString();}private Map getQueryParams(String uri) {QueryStringDecoder queryDecoder = new QueryStringDecoder(uri, Charsets.toCharset(CharEncoding.UTF_8));Map> parameters = queryDecoder.parameters();Map queryParams = new HashMap<>();for (Map.Entry> attr : parameters.entrySet()) {for (String attrVal : attr.getValue()) {queryParams.put(attr.getKey(), attrVal);}}return queryParams;}}我这里只是简单得把 URI 的查询参数的对应关系直接返回给客户端了 。


推荐阅读