文章插图
简介上一篇的文章中,我们讲到了如何从HTTP服务器中下载文件,和搭建下载文件服务器应该注意的问题,使用的GET方法 。本文将会讨论一下常用的向服务器提交数据的POST方法和如何向服务器上传文件 。
GET方法上传数据按照HTTP的规范,PUT一般是向服务器上传数据,虽然不提倡,但是也可以使用GET向服务器端上传数据 。
先看下GET客户端的构建中需要注意的问题 。
GET请求实际上就是一个URI,URI后面带有请求的参数,netty提供了一个QueryStringEncoder专门用来构建参数内容:
// HTTP请求QueryStringEncoder encoder = new QueryStringEncoder(get);// 添加请求参数encoder.addParam("method", "GET");encoder.addParam("name", "flydean");encoder.addParam("site", "www.flydean.com");URI uriGet = new URI(encoder.toString());有了请求URI,就可以创建HttpRequest了,当然这个HttpRequest中还需要有对应的HTTP head数据:
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中只有两部分数据,分别是HttpVersion和HttpHeaders 。HttpVersion就是HTTP协议的版本号,HttpHeaders就是设置的header内容 。
对于GET请求来说,因为所有的内容都包含在URI中,所以不需要额外的HTTPContent,直接发送HttpRequest到服务器就可以了 。
channel.writeAndFlush(request);然后看下服务器端接收GET请求之后怎么进行处理 。
服务器端收到HttpObject对象的msg之后,需要将其转换成HttpRequest对象,就可以通过protocolVersion(),uri()和headers()拿到相应的信息 。
对于URI中的参数,netty提供了QueryStringDecoder类可以方便的对URI中参数进行解析:
//解析URL中的参数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方法上传数据对于POST请求,它比GET请求多了一个HTTPContent,也就是说除了基本的HttpRequest数据之外,还需要一个PostBody 。
如果只是一个普通的POST,也就是POST内容都是key=value的形式,则比较简单,如果POST中包含有文件,那么会比较复杂,需要用到ENCTYPE=”multipart/form-data” 。
netty提供了一个HttpPostRequestEncoder类,用于快速对request body进行编码,先看下HttpPostRequestEncoder类的完整构造函数:
public HttpPostRequestEncoder(HttpDataFactory factory, HttpRequest request, boolean multipart, Charset charset,EncoderMode encoderMode)其中request就是要编码的HttpRequest,multipart表示是否是”multipart/form-data”的格式,charset编码方式,默认情况下是CharsetUtil.UTF_8 。encoderMode是编码的模式,目前有三种编码模式,分别是RFC1738,RFC3986和HTML5 。
默认情况下的编码模式是RFC1738,这也是大多数form提交数据的编码方式 。但是它并不适用于OAUTH,如果要使用OAUTH的话,则可以使用RFC3986 。HTML5禁用了multipart/form-data的混合模式 。
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- 阿里云服务器价格表 阿里云个人服务器价格
- linux重启服务器命令 linux重启命令reboot
- 防止服务器被攻击 防攻击服务器多少钱
- dns常用服务器地址 dns服务器ip地址在哪
- 轻松打开pkg文件的方法 pkg文件用什么打开
- 搭建稳定的代理ip池 ip代理服务器搭建
- xml文件扩展名 xml是什么文件格式
- 百度网盘秒传链接取方法 百度网盘怎么用链接搜索文件
- 描述文件永久无法删除 苹果描述文件无法删除
- windows10强制删除文件的方法 手机文件强制删除工具