大型网站制作公司,自己做的网站怎么被搜索出来,郑州做网站公司汉狮网,个人用云服务器浅谈HTTP
要通过netty实现HTTP服务器(或者客户端)#xff0c;首先你要了解HTTP协议。
HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。
例如#xff0c;web浏览器可以是客户端#xff0c;并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交…浅谈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/?id010101浏览器会自动将表单内容转为Query String 加在URL 进行连线。
这时后来看一下HTTP Request 封包的内容 下面展示一些 内联代码片。
GET /?id010101 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/xhtmlxml,application/xml;q0.9,*/*;q0.8Accept-Language: zh-tw,en-us;q0.7,en;q0.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 methodpost actioninput typetext nameid /input typesubmit //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/xhtmlxml,application/xml;q0.9,*/*;q0.8Accept-Language: zh-tw,en-us;q0.7,en;q0.3Accept-Encoding: gzip,deflateAccept-Charset: UTF-8,*Keep-Alive: 115Connection: keep-aliveContent-Type: application/x-www-form-urlencoded/codecodeContent-Length: 9id020202Netty HTTP编解码
要通过 Netty 处理 HTTP 请求需要先进行编解码。
public class HttpHelloWorldServerInitializer extends ChannelInitializerSocketChannel {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 的结合。