文档章节

Spring MVC 接收POST表单请求,获取参数总结

_
 _桃子_
发布于 2015/12/01 17:43
字数 504
阅读 2599
收藏 7

    前段时间遇到一个问题,在spring mvc 服务端接收post请求时,通过html 表单提交的时候,服务端能够接收到参数的值。但是使用httpclient4.3构造post请求,却无法接收到参数的值。

spring 代码:

    @RequestMapping(value = "login.do", method = RequestMethod.POST)
    @ResponseBody
    public String login(String username, String password) throws Exception {
        return username + ":" + password;
    }

表单代码:

<form action="http://localhost:8080/test/login.do" id="frm" method="post">
    name:<input type="text" name="username" id="username"/>   </br>
    psword:<input type="text" name="password" id="password"/>  </br>
    <input id="submit" type="submit" />
 </form>

httpclient4.3发送post代码:

    @Test
    public void testMultipartPost() throws IOException {
        HttpPost httpPost = new HttpPost("http://localhost:8080/test/login.do");
        try {
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
            CloseableHttpClient httpClient = httpClientBuilder.build();
            RequestConfig config = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000).build();
            httpPost.setConfig(config);
            MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
            multipartEntityBuilder.setCharset(Charset.forName("UTF-8"));
            multipartEntityBuilder.addTextBody("username", "taozi");
            multipartEntityBuilder.addTextBody("password", "123");
            HttpEntity httpEntity = multipartEntityBuilder.build();
            httpPost.setEntity(httpEntity);
            HttpResponse response = httpClient.execute(httpPost);
            System.out.println(EntityUtils.toString(response.getEntity()));
        } finally {
            httpPost.releaseConnection();
        }
    }

一直在查找原因,为什么通过httpclient4.3构造的post请求,服务端无法接收到传输的参数。比较与html的差异,发现httpclient构造的请求使用的是multipart形式。而表单上传使用的是默认形式的编码,x-www-form-urlencoded,所以表单能够成功。现在找到问题了,将httpclient的构造代码,改为x-www-form-urlencoded编码上传,

@Test
    public void testUrlencodedPost() throws IOException {
        HttpPost httpPost = new HttpPost("http://localhost:8080/test/login.do");
        try {
            CloseableHttpClient client = HttpClients.createDefault();
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", "taozi"));
            params.add(new BasicNameValuePair("password", "123"));
            HttpEntity httpEntity = new UrlEncodedFormEntity(params, "UTF-8");
            httpPost.setEntity(httpEntity);
            CloseableHttpResponse response = client.execute(httpPost);
            System.out.println(EntityUtils.toString(response.getEntity()));
        } finally {
            httpPost.releaseConnection();
        }
    }

现在服务端能够正常的接收到请求了,现在总结一下表单两种编码的形式

application/x-www-form-urlencoded   空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值

multipart/form-data    不对字符进行编码,使用二进制数据传输,一般用于上传文件,非文本的数据传输。


spring mvc如果要接收 multipart/form-data 传输的数据,应该在spring上下文配置

<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">       
    </bean>

这样服务端就既可以接收multipart/form-data 传输的数据,也可以接收application/x-www-form-urlencoded传输的文本数据了。




© 著作权归作者所有

_
粉丝 1
博文 5
码字总数 2988
作品 0
成都
私信 提问
Spring MVC Flash Attribute 的讲解与使用示例

Spring MVC 3.1版本加了一个很有用的特性,Flash属性,它能解决一个长久以来缺少解决的问题,一个POST/Redirect/GET模式问题。 正常的MVC Web应用程序在每次提交都会POST数据到服务器。一个正...

0595
2014/04/09
21K
24
基于注解的 Spring MVC 简单入门

以下内容是经过自己整理资料、官方文档所得: web.xml 配置: 这样,所有的.htm的请求,都会被DispatcherServlet处理; 初始化 DispatcherServlet 时,该框架在 web 应用程序WEB-INF 目录中寻...

超级奶爸老谭
2010/07/07
176.8K
37
Spring MVC 与主流架构 RESTful 的集成

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/97791177 前言 这一讲来学习 Spring MVC 对...

GitChat技术杂谈
07/30
0
0
SpringMVC控制器接收不了PUT提交的参数的解决方案

这次改造了下框架,把控制器的API全部REST化,不做不知道,SpringMVC的REST有各种坑让你去跳,顺利绕过它们花了我不少时间,这次来提下SpringMVC的PUT提交参数为null的情况。 照常先贴出我的...

Big_BoBo
2014/01/10
12.5K
1
实现HTTP PUT方式上传文件。

使用restful方式编程,有时候put方式修改文件。但是默认情况下很多浏览器(比如:chrom)不支持put方式修改文件。spring默认情况下也不支持PUT方式修改文件。如果想要支持,方式如下: 一、后...

王坤charlie
2017/11/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

从0开始学FreeRTOS-(列表&列表项)-6

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
22分钟前
4
0
Java的23种设计模式,详细讲解(一)

一、概述 设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用。 拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。 二、创建型 1. 单例(Singleton...

李红欧巴
38分钟前
5
0
android 使用asynctask结合fragment更新UI(另附线程池管理示例)

https://blog.csdn.net/qq_16064871/article/details/70767949

shzwork
38分钟前
3
0
SpringCloud实现分库分表模式下,数据库实时扩容方案

本文源码:GitHub·点这里 || GitEE·点这里 一、项目结构 1、工程结构 2、模块命名 shard-common-entity: 公共代码块shard-open-inte: 开放接口管理shard-eureka-7001: ...

知了一笑
39分钟前
5
0
js--时间切割装换工具类

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 修改data原型对象Format方法 ......

zhengzhixiang
49分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部