表单(POST请求)的三种编码 您所在的位置:网站首页 编码方式设置有哪些 表单(POST请求)的三种编码

表单(POST请求)的三种编码

2024-07-10 22:44| 来源: 网络整理| 查看: 265

表单有两种提交方式,POST和GET。通常我们会使用POST方式,一是因为形式上的安全 ;二是可以上传文件。

我之前经常忽略掉表单的编码类型,觉得它特别长比较难记,而且不设置也似乎不影响什么。表单的编码类型,用来控制表单中的数据的编码格式。 默认 enctype=“application/x-www-form-urlencoded”,数据以键值对的方式传送到服务器,这种方式适合于大多数场景。

表单(POST请求)支持下面三种编码:

enctypeapplication/x-www-form-urlencoded默认, key1=value1&key2=value2multipart/form-data一般用于表单需要文件上传text/plain ,application/json传递文本内容 1.application/x-www-form-urlencoded GET方式,会将表单中的数据(键值对)经过urlencode编码后追加到url中。POST方式,会将表单中的数据经过urlencode编码后放在request body 中。 name: password:

POST 提交方式: name 传递 “测试人”,password 传递“test”.(postman 工具测试结果)

Content-Type: application/x-www-form-urlencoded name:%E6%B5%8B%E8%AF%95%E4%BA%BA password:test

该编码方式,会将表单数据中的非西欧字符转化为十六进制数字的形式。utf8字符集中,每个汉字占3个字节,每个汉字会转化成3个十六进制的数 %XX%XX%XX 的形式。

在java 代码中经常会处理下载文件名中文乱码的问题,对于IE,谷歌等浏览器用到的就是编码方式。

try { System.out.println(URLEncoder.encode("测试人","UTF8")); //%E6%B5%8B%E8%AF%95%E4%BA%BA } catch (UnsupportedEncodingException e) { e.printStackTrace(); }

当然浏览器不同使用的处理编码也不尽相同。在使用Chrome的话显示如下(gb2312编码),这个可能和当前使用的语言环境有关:

name: %B2%E2%CA%D4%C8%CB password: test

传递完参数以后,接下来就是在后台去获取传递的数据。 获取参数常用方法:

Map maps= request.getParameterMap(); //获取所有的键值对 Enumeration names= request.request.getParameterNames();//获取所有的参数名 String[] values = request.getParameterValues(parameterName); //获取某个参数下的所有值,适合多选组件 String value = request.getParameter(parameterName); //获取某个参数对应的值,适合文本组件,单选等 ServletInputStream stream=request.getInputStream();//需要注意的是,该方法只能被调用一次,再次调用返回结果为空 BufferedReader reader=request.getReader();//该方法也是只能调用一次

需要额外注意的是:getInputStream 方法和getReader方法互斥。最多只能调用其中的一个,如果这两个方法都被调用则会抛出异常。

request.getInputStream();//需要注意的是,该方法只能被调用一次,再次调用返回结果为空 request.getReader();//该方法也是只能调用一次

如果需要在表单中上传文件则不能使用该方式

2.multipart/form-data

当需要在表单内上传文件时(二进制流数据)时,就需要使用 multipart/form-data。

手机号 邮箱 头像

相应的Request 请求头

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="phone" //空行 16666666666 ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="mail" //空行 [email protected] ------WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="portrait "; filename="portrait.png" Content-Type: image/png //空行 ------WebKitFormBoundary7MA4YWxkTrZu0gW--

multipart,顾名思义 多部分。使用该编码方式会将表单进行分割成每个控件(以----boundary为分隔符,将分割控件数据分隔开,在最后以—boundary—结尾)。每个部分必须加上Content-Disposition(form-data) ,对于上传文件还会设置Content-Type。

对于上传的不同类型的文件,会自动识别文件类型,如果识别不了则设置为application/octet-stream。

上传jpeg格式图片Content-Type: image/jpeg 上传pdf文件Content-Type: application/pdf 上传MP3Content-Type: audio/mp3

对于使用该方式提交的表单,在服务器端的参数获取通常有以下两种:

单独获取 键值对数据。 使用getParameterMap() 等方法获取数据获取全部数据(键值对和二进制流) getParts()。

使用getParts()方法,要求Content-Type:multipart/form-data,否则抛出异常 通过Part 获取上传的文本内容

StringBuffer bPart=new StringBuffer(); Collection parts = request.getParts(); for(Part part :parts) { System.out.println(part.getContentType()); InputStream inPart = part.getInputStream(); byte[] buff =new byte[1024]; int length=0; while((length=inPart.read(buff))!=-1) { System.out.println(new String(buff,0,length,"utf8")); bPart.append(new String(buff,0,length,"utf8")); } } System.out.println(bPart.toString()); 文本

可以指定的文本内容格式有多种,application/json是最常用的

text/plain: 纯文本text/xml :传递xml语法格式的字符串text/html: 传递html字符串application/json : 传递序列化后的 JSON 字符串。

最常用的是application/json,比较适合Restful接口的调用。

获取数据

ServletInputStream in = request.getInputStream();

文本数据格式,会使用流的方式传递数据。在springmvc中使用@RequestBody注解对应的注解解释类应该就是通过InputSteam获取数据并转化为json对象。

小结

使用不同的编码方式,服务端获取参数的方式也不尽相同。

application/x-www-form-urlencoded。 该方式就是常规的方法, getParameterMap(),getParameter(),getInputStream()等方式获取参数

multipart/form-data

号键值对二进制数据1getParameter(),getParameterMapgetParts();2getParts()

注意: getParts() 必须是 ”multipart/form-data“ ,否则抛出ServletException,如果上传文件特别大则会抛出IllegalStateException

application/json等文本格式。使用getInputStream()获取数据。

重复说明:

getReader()和getInputSteam()互斥getReader()和getInputStream() 只能调用一次


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有