几十行代码基于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));
我们通过 FullHttpResponse
的headers()
方法获取到 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 :更新服务器上的资源(客户端提供更改的属性 , 可以看做作是部分更新) , 使用的比较少 , 这里就不举例子了 。
@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 的查询参数的对应关系直接返回给客户端了 。
推荐阅读
- 华硕基于WRX80的主板现身 为AMD Ryzen Threadripper Pro打造
- 锐龙5000微代码更新:超频更稳、X570无需风扇
- 微软新版电子邮件客户端截图曝光:基于网页端Outlook
- 小米MIUI代码泄露新机:或edmi K40
- 曝光 | 小鹏或春节前推送NGP更新,基于高精地图可自动变道
- 用Python制作图片验证码,这三行代码完事儿
- 基于Spring+Angular9+MySQL开发平台
- 微软称SolarWinds黑客攻击波及公司内部的源代码存储库
- 整合零代码+AI+云原生技术,「速优云」布局智慧教培和智慧社区
- 终于可以自定义喇叭声:你的特斯拉可以“放屁”吓唬人了