中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

龙岩市| 铜川市| 平泉县| 鄂温| 曲水县| 奉节县| 镇雄县| 龙南县| 温宿县| 邹平县| 延长县| 柳河县| 龙里县| 阿拉尔市| 泰宁县| 霞浦县| 绵阳市| 迭部县| 临漳县| 普兰店市| 谷城县| 石渠县| 佛冈县| 广州市| 安义县| 高碑店市| 乌兰浩特市| 鸡东县| 二连浩特市| 同江市| 涿鹿县| 彰化县| 沙洋县| 禄劝| 九寨沟县| 新乡市| 大城县| 梧州市| 陈巴尔虎旗| 万宁市| 宁陕县|