亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Netty4之怎么實現HTTP請求、響應

發布時間:2023-04-04 10:44:52 來源:億速云 閱讀:176 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Netty4之怎么實現HTTP請求、響應”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Netty4之怎么實現HTTP請求、響應”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

1.Netty中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

*

2.Netty中客戶端、服務端的編解碼器

作為服務端而言:

主要工作就是接收客戶端請求,將客戶端的請求內容解碼;發送響應給客戶端,并將發送內容編碼

所以,服務端需要兩個編解碼器

* HttpRequestDecoder(將請求內容解碼)

* HttpResponseEncoder(將響應內容編碼)

作為客戶端而言:

主要工作就是發送請求給服務端,并將發送內容編碼;接收服務端響應,并將接收內容解碼;

所以,客戶端需要兩個編解碼器

* HttpResponseDecoder(將響應內容解碼)

* HttpRequestEncoder(將請求內容編碼)

3.Server端編寫Handler類處理客戶請求

創建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

*

4.測試

啟動Server類使用客戶端發送請求

在這里,筆者不單獨編寫Netty客戶端代碼,直接使用PostMan來充當客戶端發送請求,具體如下:

Netty4之怎么實現HTTP請求、響應

發送一個post請求,并填寫body,點擊send,可以看到響應如下所示:

Netty4之怎么實現HTTP請求、響應

讀到這里,這篇“Netty4之怎么實現HTTP請求、響應”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄢陵县| 恩平市| 彩票| 千阳县| 荆门市| 阜新| 岑巩县| 富锦市| 张掖市| 武义县| 灵宝市| 富宁县| 新绛县| 饶河县| 扬中市| 绥棱县| 阿鲁科尔沁旗| 龙泉市| 威海市| 大冶市| 连州市| 墨竹工卡县| 深水埗区| 进贤县| 义马市| 杂多县| 德昌县| 富锦市| 宁南县| 清水河县| 怀安县| 剑阁县| 霍林郭勒市| 嘉义市| 嘉祥县| 六盘水市| 澄迈县| 葫芦岛市| 囊谦县| 平乡县| 沛县|