您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Netty4之怎么實現HTTP請求、響應”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Netty4之怎么實現HTTP請求、響應”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
請求(FullHttpRequest)
/** * Combine the {@link HttpRequest} and {@link FullHttpMessage}, so the request is a <i>complete</i> HTTP * request. */ public interface FullHttpRequest extends HttpRequest, FullHttpMessage {
可以看到,它結合了HttpRequest、FullHttpMessag,作為一個完整的HTTP請求體。
默認實現為DefaultFullHttpRequest
響應(FullHttpResponse)
/** * Combination of a {@link HttpResponse} and {@link FullHttpMessage}. * So it represent a <i>complete</i> http response. */ public interface FullHttpResponse extends HttpResponse, FullHttpMessage {
同樣,它結合了HttpResponse、FullHttpMessage
默認實現為DefaultFullHttpResponse
*
作為服務端而言:
主要工作就是接收客戶端請求,將客戶端的請求內容解碼;發送響應給客戶端,并將發送內容編碼
所以,服務端需要兩個編解碼器
* HttpRequestDecoder(將請求內容解碼)
* HttpResponseEncoder(將響應內容編碼)
作為客戶端而言:
主要工作就是發送請求給服務端,并將發送內容編碼;接收服務端響應,并將接收內容解碼;
所以,客戶端需要兩個編解碼器
* HttpResponseDecoder(將響應內容解碼)
* HttpRequestEncoder(將請求內容編碼)
創建Handler,命名為HttpHandler,具體內容如下:
import com.alibaba.fastjson.JSONObject; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.util.CharsetUtil; import lombok.Data; /** * 處理HTTP請求 * @author Administrator * */ public class HttpHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if(msg instanceof FullHttpRequest){ FullHttpRequest req = (FullHttpRequest)msg; try { // 1.獲取URI String uri = req.uri(); // 2.獲取請求體 ByteBuf buf = req.content(); String content = buf.toString(CharsetUtil.UTF_8); // 3.獲取請求方法 HttpMethod method = req.method(); // 4.獲取請求頭 HttpHeaders headers = req.headers(); // 5.根據method,確定不同的邏輯 if(method.equals(HttpMethod.GET)){ // TODO } if(method.equals(HttpMethod.POST)){ // 接收用戶輸入,并將輸入返回給用戶 Content c = new Content(); c.setUri(uri); c.setContent(content); response(ctx, c); } if(method.equals(HttpMethod.PUT)){ // TODO } if(method.equals(HttpMethod.DELETE)){ // TODO } } finally { req.release(); } } } private void response(ChannelHandlerContext ctx, Content c) { // 1.設置響應 FullHttpResponse resp = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.copiedBuffer(JSONObject.toJSONString(c), CharsetUtil.UTF_8)); resp.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html; charset=UTF-8"); // 2.發送 // 注意必須在使用完之后,close channel ctx.writeAndFlush(resp).addListener(ChannelFutureListener.CLOSE); } } @Data class Content{ String uri; String content; }
注意:
在處理過程中,把msg轉換為FullHttpRequest,可以獲取關于請求的所有內容;
在發送響應時必須要監聽CLOSE
*
啟動Server類使用客戶端發送請求
在這里,筆者不單獨編寫Netty客戶端代碼,直接使用PostMan來充當客戶端發送請求,具體如下:
發送一個post請求,并填寫body,點擊send,可以看到響應如下所示:
讀到這里,這篇“Netty4之怎么實現HTTP請求、響應”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。