
文章插圖
簡介上一篇的文章中,我們講到了如何從HTTP服務(wù)器中下載文件,和搭建下載文件服務(wù)器應(yīng)該注意的問題,使用的GET方法 。本文將會(huì)討論一下常用的向服務(wù)器提交數(shù)據(jù)的POST方法和如何向服務(wù)器上傳文件 。
GET方法上傳數(shù)據(jù)按照HTTP的規(guī)范,PUT一般是向服務(wù)器上傳數(shù)據(jù),雖然不提倡,但是也可以使用GET向服務(wù)器端上傳數(shù)據(jù) 。
先看下GET客戶端的構(gòu)建中需要注意的問題 。
GET請(qǐng)求實(shí)際上就是一個(gè)URI,URI后面帶有請(qǐng)求的參數(shù),netty提供了一個(gè)QueryStringEncoder專門用來構(gòu)建參數(shù)內(nèi)容:
// HTTP請(qǐng)求QueryStringEncoder encoder = new QueryStringEncoder(get);// 添加請(qǐng)求參數(shù)encoder.addParam("method", "GET");encoder.addParam("name", "flydean");encoder.addParam("site", "www.flydean.com");URI uriGet = new URI(encoder.toString());有了請(qǐng)求URI,就可以創(chuàng)建HttpRequest了,當(dāng)然這個(gè)HttpRequest中還需要有對(duì)應(yīng)的HTTP head數(shù)據(jù):HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uriGet.toASCIIString());HttpHeaders headers = request.headers();headers.set(HttpHeaderNames.HOST, host);headers.set(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE);headers.set(HttpHeaderNames.ACCEPT_ENCODING, HttpHeaderValues.GZIP + "," + HttpHeaderValues.DEFLATE);headers.set(HttpHeaderNames.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");headers.set(HttpHeaderNames.REFERER, uriSimple.toString());headers.set(HttpHeaderNames.USER_AGENT, "Netty Simple Http Client side");headers.set(HttpHeaderNames.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");headers.set(HttpHeaderNames.COOKIE, ClientCookieEncoder.STRICT.encode(new DefaultCookie("name", "flydean"),new DefaultCookie("site", "www.flydean.com")));我們知道HttpRequest中只有兩部分?jǐn)?shù)據(jù),分別是HttpVersion和HttpHeaders 。HttpVersion就是HTTP協(xié)議的版本號(hào),HttpHeaders就是設(shè)置的header內(nèi)容 。對(duì)于GET請(qǐng)求來說,因?yàn)樗械膬?nèi)容都包含在URI中,所以不需要額外的HTTPContent,直接發(fā)送HttpRequest到服務(wù)器就可以了 。
channel.writeAndFlush(request);然后看下服務(wù)器端接收GET請(qǐng)求之后怎么進(jìn)行處理 。服務(wù)器端收到HttpObject對(duì)象的msg之后,需要將其轉(zhuǎn)換成HttpRequest對(duì)象,就可以通過protocolVersion(),uri()和headers()拿到相應(yīng)的信息 。
對(duì)于URI中的參數(shù),netty提供了QueryStringDecoder類可以方便的對(duì)URI中參數(shù)進(jìn)行解析:
//解析URL中的參數(shù)QueryStringDecoder decoderQuery = new QueryStringDecoder(request.uri());Map<String, List<String>> uriAttributes = decoderQuery.parameters();for (Entry<String, List<String>> attr: uriAttributes.entrySet()) {for (String attrVal: attr.getValue()) {responseContent.append("URI: ").append(attr.getKey()).append('=').append(attrVal).append("\r\n");}}POST方法上傳數(shù)據(jù)對(duì)于POST請(qǐng)求,它比GET請(qǐng)求多了一個(gè)HTTPContent,也就是說除了基本的HttpRequest數(shù)據(jù)之外,還需要一個(gè)PostBody 。如果只是一個(gè)普通的POST,也就是POST內(nèi)容都是key=value的形式,則比較簡單,如果POST中包含有文件,那么會(huì)比較復(fù)雜,需要用到ENCTYPE=”multipart/form-data” 。
netty提供了一個(gè)HttpPostRequestEncoder類,用于快速對(duì)request body進(jìn)行編碼,先看下HttpPostRequestEncoder類的完整構(gòu)造函數(shù):
public HttpPostRequestEncoder(HttpDataFactory factory, HttpRequest request, boolean multipart, Charset charset,EncoderMode encoderMode)其中request就是要編碼的HttpRequest,multipart表示是否是”multipart/form-data”的格式,charset編碼方式,默認(rèn)情況下是CharsetUtil.UTF_8 。encoderMode是編碼的模式,目前有三種編碼模式,分別是RFC1738,RFC3986和HTML5 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 激活批處理文件的方法 win7激活命令行批處理
- bat腳本打開應(yīng)用程序 bat格式文件怎么打開
- 阿里云服務(wù)器租用費(fèi)用 阿里云服務(wù)器使用教程
- vmware服務(wù)器版 vmware安裝安卓系統(tǒng)
- 十大云服務(wù)器排行榜 云主機(jī)租用哪家好
- 云服務(wù)器搭建虛擬主機(jī) 虛擬主機(jī)和云服務(wù)器區(qū)別
- vba打開指定excel文件并關(guān)閉操作 vba打開指定excel文件并關(guān)閉
- 頁面重新加載JS方法 重新加載js文件
- nas網(wǎng)絡(luò)存儲(chǔ)服務(wù)器使用 nas存儲(chǔ)服務(wù)器搭建
- win10訪問ftp文件夾錯(cuò)誤 ftp無法訪問此文件夾
