最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)

 更新時(shí)間:2023年04月04日 09:51:41   作者:恐龍弟旺仔  
這篇文章主要介紹了Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

我們所編寫的項(xiàng)目多以BS為主,用戶通過(guò)瀏覽器訪問(wèn)我們的服務(wù)器

發(fā)送的請(qǐng)求以HTTP請(qǐng)求為主,本例就以Netty4來(lái)實(shí)現(xiàn)一個(gè)接收HTTP請(qǐng)求的服務(wù)器,并根據(jù)用戶請(qǐng)求返回響應(yīng)

1.Netty中HTTP請(qǐng)求和響應(yīng)類

請(qǐng)求(FullHttpRequest)

/**
 * Combine the {@link HttpRequest} and {@link FullHttpMessage}, so the request is a <i>complete</i> HTTP
 * request.
 */
public interface FullHttpRequest extends HttpRequest, FullHttpMessage {

可以看到,它結(jié)合了HttpRequest、FullHttpMessag,作為一個(gè)完整的HTTP請(qǐng)求體。

默認(rèn)實(shí)現(xiàn)為DefaultFullHttpRequest

響應(yīng)(FullHttpResponse)

/**
 * Combination of a {@link HttpResponse} and {@link FullHttpMessage}.
 * So it represent a <i>complete</i> http response.
 */
public interface FullHttpResponse extends HttpResponse, FullHttpMessage {

同樣,它結(jié)合了HttpResponse、FullHttpMessage

默認(rèn)實(shí)現(xiàn)為DefaultFullHttpResponse

*

2.Netty中客戶端、服務(wù)端的編解碼器

作為服務(wù)端而言:

主要工作就是接收客戶端請(qǐng)求,將客戶端的請(qǐng)求內(nèi)容解碼;發(fā)送響應(yīng)給客戶端,并將發(fā)送內(nèi)容編碼

所以,服務(wù)端需要兩個(gè)編解碼器

* HttpRequestDecoder(將請(qǐng)求內(nèi)容解碼)

* HttpResponseEncoder(將響應(yīng)內(nèi)容編碼)

作為客戶端而言:

主要工作就是發(fā)送請(qǐng)求給服務(wù)端,并將發(fā)送內(nèi)容編碼;接收服務(wù)端響應(yīng),并將接收內(nèi)容解碼;

所以,客戶端需要兩個(gè)編解碼器

* HttpResponseDecoder(將響應(yīng)內(nèi)容解碼)

* HttpRequestEncoder(將請(qǐng)求內(nèi)容編碼)

3.Server端編寫Handler類處理客戶請(qǐng)求

創(chuàng)建Handler,命名為HttpHandler,具體內(nèi)容如下:

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請(qǐng)求
 * @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.獲取請(qǐng)求體
				ByteBuf buf = req.content();
				String content = buf.toString(CharsetUtil.UTF_8);
				
				// 3.獲取請(qǐng)求方法
				HttpMethod method = req.method();
				
				// 4.獲取請(qǐng)求頭
				HttpHeaders headers = req.headers();
				
				// 5.根據(jù)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.設(shè)置響應(yīng)
		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.發(fā)送
		// 注意必須在使用完之后,close channel
		ctx.writeAndFlush(resp).addListener(ChannelFutureListener.CLOSE);
	}
}

@Data
class Content{
	String uri;
	String content;
}

注意:

在處理過(guò)程中,把msg轉(zhuǎn)換為FullHttpRequest,可以獲取關(guān)于請(qǐng)求的所有內(nèi)容;

在發(fā)送響應(yīng)時(shí)必須要監(jiān)聽CLOSE

*

4.測(cè)試

啟動(dòng)Server類使用客戶端發(fā)送請(qǐng)求

在這里,筆者不單獨(dú)編寫Netty客戶端代碼,直接使用PostMan來(lái)充當(dāng)客戶端發(fā)送請(qǐng)求,具體如下:

在這里插入圖片描述

發(fā)送一個(gè)post請(qǐng)求,并填寫body,點(diǎn)擊send,可以看到響應(yīng)如下所示:

在這里插入圖片描述

參考:Netty in Action

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring系統(tǒng)屬性及spring.properties配置文件示例詳解

    Spring系統(tǒng)屬性及spring.properties配置文件示例詳解

    spring中有一個(gè)SpringProperties類,來(lái)保存spring的系統(tǒng)屬性,本文結(jié)合實(shí)例代碼對(duì)Spring系統(tǒng)屬性及spring.properties配置文件相關(guān)知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-07-07
  • java中jdk的下載和安裝全過(guò)程

    java中jdk的下載和安裝全過(guò)程

    這篇文章主要給大家介紹了關(guān)于java中jdk的下載和安裝的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java中for循環(huán)刪除集合陷阱

    java中for循環(huán)刪除集合陷阱

    java中在增強(qiáng)for循環(huán)為什么不能增刪集合呢?一個(gè)循環(huán)迭代,跟集合的增刪改沒(méi)什么關(guān)系。修改集合不是for去做的。for只管循環(huán)迭代,你在循環(huán)里邊修改集合,改變集合的長(zhǎng)度,順序?qū)ρh(huán)都有影響
    2015-05-05
  • java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法

    java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了java排序高級(jí)之選擇排序?qū)崿F(xiàn)方法,較為全面的分析了選擇排序的原理與具體實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • Java中如何避免sql注入實(shí)例詳解

    Java中如何避免sql注入實(shí)例詳解

    SQL注入是最常見的攻擊方式之一,它不是利用操作系統(tǒng)或其它系統(tǒng)的漏洞來(lái)實(shí)現(xiàn)攻擊的,而是程序員因?yàn)闆](méi)有做好判斷,被不法用戶鉆了SQL的空子,下面這篇文章主要給大家介紹了關(guān)于Java中如何避免sql注入的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 詳解jenkins自動(dòng)部署springboot應(yīng)用的方法

    詳解jenkins自動(dòng)部署springboot應(yīng)用的方法

    這篇文章主要介紹了詳解jenkins自動(dòng)部署springboot應(yīng)用的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • SpringBoot項(xiàng)目中application.yml和bootstrap.yml文件的區(qū)別及說(shuō)明

    SpringBoot項(xiàng)目中application.yml和bootstrap.yml文件的區(qū)別及說(shuō)明

    `application.yml`和`bootstrap.yml`都是Spring Boot項(xiàng)目中的配置文件,但它們?cè)诩虞d時(shí)機(jī)、用途、優(yōu)先級(jí)、配置來(lái)源、適用場(chǎng)景和是否必須存在等方面存在區(qū)別
    2025-03-03
  • 解析Java和IDEA中的文件打包問(wèn)題

    解析Java和IDEA中的文件打包問(wèn)題

    這篇文章主要介紹了Java和IDEA中的文件打包問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法

    java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)轉(zhuǎn)圈打印矩陣算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Java中如何模擬HTTP請(qǐng)求并驗(yàn)證功能

    Java中如何模擬HTTP請(qǐng)求并驗(yàn)證功能

    要模擬HTTP請(qǐng)求并驗(yàn)證功能,你可以使用Spring Boot提供的MockMvc工具,它允許我們?cè)跊](méi)有實(shí)際啟動(dòng)HTTP服務(wù)器的情況下測(cè)試Spring MVC控制器,下面給大家分享如何模擬HTTP請(qǐng)求并驗(yàn)證功能,感興趣的朋友一起看看吧
    2024-05-05

最新評(píng)論

会泽县| 辉县市| 从江县| 育儿| 广东省| 皮山县| 阿城市| 南平市| 康平县| 马边| 芜湖市| 宁明县| 亚东县| 原阳县| 襄垣县| 曲靖市| 闽清县| 恭城| 互助| 故城县| 上林县| 乌拉特前旗| 崇仁县| 凤山市| 潞西市| 浦东新区| 隆尧县| 柘城县| 察哈| 金寨县| 巴塘县| 武穴市| 三原县| 福州市| 儋州市| 精河县| 吐鲁番市| 洮南市| 疏勒县| 石棉县| 图木舒克市|