当前位置: 首页 > news >正文

浅谈HTTP

浅谈HTTP

要通过netty实现HTTP服务器(或者客户端),首先你要了解HTTP协议。

HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。

例如,web浏览器可以是客户端,并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交HTTP请求消息。

服务器提供诸如HTML文件和其他内容之类的资源,或代表客户端执行其他功能,向客户端返回响应消息。 响应包含有关请求的完成状态信息,并且还可以在其消息正文中包含所请求的内容。

什么是HTTP方法?

有写过网页表单的人一定对GET与POST不陌生,但你了解什么是GET与POST吗!?现今的网页设计工具相当的发达,甚至不需要接触HTML语法就能完成一个规模不小的网站,渐渐地很多人都忘记了HTTP底层的实作原理,造成在发生错误的情况下无法正确进行侦错。

早期在撰写HTML 表单语法时,都会写到以下的写法,然而大部分的软件工程师都会采用POST 进行表单传送。

然而在我们的网页程序中要获取表单的变数只需要调用系统已经封装好的方法即可,像是PHP使用$_REQUEST、JAVA使用getParameter()、ASP使用Request.Form()这些方法等等。 由上述的方法看来,似乎用POST或GET好像不是很重要。许多Web工程师对于表单method用法的记忆为"POST可以传送比较多的资料"、"表单传送档案的时候要使用POST"、"POST比GET安全"等等奇怪的概念。

其实使用POST 或GET 其实是有差别的,我们先说明一下HTTP Method,在HTTP 1.1 的版本中定义了八种Method (方法),如下所示:

OPTIONS

GET

HEAD

POST

PUT

DELETE

TRACE

CONNECT
GET与POST方法
先举个例子,如果HTTP 代表现在我们现实生活中寄信的机制。

我们姑且将信封外的内容称为http-header,信封内的书信称为message-body,那么HTTP Method 就是你要告诉邮差的寄信规则。

假设GET 表示信封内不得装信件的寄送方式,如同是明信片一样,你可以把要传递的资讯写在信封(http-header)上,写满为止,价格比较便宜。然而POST 就是信封内有装信件的寄送方式(信封有内容物),不但信封可以写东西,信封内(message-body) 还可以置入你想要寄送的资料或档案,价格较贵。

使用GET 的时候我们直接将要传送的资料以Query String(一种Key/Vaule的编码方式)加在我们要寄送的地址(URL)后面,然后交给邮差传送。

使用POST 的时候则是将寄送地址(URL)写在信封上,另外将要传送的资料写在另一张信纸后,将信纸放到信封里面,交给邮差传送。

GET方法
接着我来介绍一下实际的运作情况:

我们先来看看GET 怎么传送资料的,当我们送出一个GET 表单时,如下范例:

当表单Submit 之后浏览器的网址就变成"http://xxx.toright.com/?id=010101",浏览器会自动将表单内容转为Query String 加在URL 进行连线。

这时后来看一下HTTP Request 封包的内容:
下面展示一些 内联代码片

GET /?id=010101 HTTP/1.1Host: xxx.toright.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1 ( .NET CLR 3.5.30729)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3Accept-Encoding: gzip,deflateAccept-Charset: UTF-8,*Keep-Alive: 115Connection: keep-alive
// An highlighted block
var foo = 'bar';

在HTTP GET Method 中是不允许在message-body 中传递资料的,因为是GET 嘛,就是要取资料的意思。

从浏览器的网址列就可以看见我们表单要传送的资料,若是要传送密码岂不是"一览无遗"…这就是大家常提到安全性问题。

POST方法
再来看看POST 传送资料

<form method="post" action=""><input type="text" name="id" /><input type="submit" /></form>

网址列没有变化,那我们来看一下HTTP Request 封包的内容:

POST / HTTP/1.1Host: xxx.toright.comUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 GTB7.1 ( .NET CLR 3.5.30729)Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3Accept-Encoding: gzip,deflateAccept-Charset: UTF-8,*Keep-Alive: 115Connection: keep-aliveContent-Type: application/x-www-form-urlencoded</code><code>Content-Length: 9id=020202

Netty HTTP编解码

要通过 Netty 处理 HTTP 请求,需要先进行编解码。

public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel> {2       @Override3       public void initChannel(SocketChannel ch) {4           ChannelPipeline p = ch.pipeline();5           /**6            * 或者使用HttpRequestDecoder & HttpResponseEncoder7            */8           p.addLast(new HttpServerCodec());9           /**
10            * 在处理POST消息体时需要加上
11            */
12           p.addLast(new HttpObjectAggregator(1024*1024));
13           p.addLast(new HttpServerExpectContinueHandler());
14           p.addLast(new HttpHelloWorldServerHandler());
15       }
16   }

第 8 行:调用#new HttpServerCodec()方法,编解码器支持部分 HTTP 请求解析,比如 HTTP GET请求所传递的参数是包含在 uri 中的,因此通过 HttpRequest 既能解析出请求参数。

HttpRequestDecoder 即把 ByteBuf 解码到 HttpRequest 和 HttpContent。

HttpResponseEncoder 即把 HttpResponse 或 HttpContent 编码到 ByteBuf。

HttpServerCodec 即 HttpRequestDecoder 和 HttpResponseEncoder 的结合。

http://www.lryc.cn/news/332099.html

相关文章:

  • HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步
  • Docker 安装 | 部署MySQL 8.x 初始设置
  • linux三剑客之流编辑器sed
  • 【Android Studio】上位机-安卓系统手机-蓝牙调试助手
  • 怎样把学浪购买的课程下载下来
  • SD-WAN如何解决更有性价比地跨境网络问题
  • 第15章 File类与IO流
  • C语言基础语法-教案16(从小白到劝退之结构体初阶)
  • Linux:ip和ip协议的初步认识
  • Android12 简单的共享内存驱动实现 参考Ashmem
  • 物理安全和逻辑安全在信息安全中的重要作用
  • 每日一题 --- 滑动窗口最大值[力扣][Go]
  • TensorBoard可视化+Confustion Matrix Drawing
  • 012——LED模块驱动开发(基于I.MX6uLL)
  • 基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计
  • 168.乐理基础-中古调式概述
  • 【项目实战】【Docker】【Git】【Linux】部署V2rayA项目
  • mac 切换 jdk
  • MD5加密返回32位密文字符串
  • npm常用命令技巧
  • intellij idea 使用git撤销(取消)commit
  • 【计算机网络】四层负载均衡和七层负载均衡
  • IP-guard WebServer 任意文件读取漏洞复现
  • 【IoTDB 线上小课 01】我们聊聊“金三银四”下的开源
  • 2024053期传足14场胜负前瞻
  • C语言------冒泡法排序
  • C#(C Sharp)学习笔记_Enum枚举类型【十三】
  • 乐知付-如何制作html文件可双击跳转到指定页面?
  • 电工技术学习笔记——直流电路及其分析方法
  • 详解python中的迭代