在弹簧休息中处理URL编码的表单数据
最后修改:2020年12月31日
1.概述
对于最终用户,表单提交的过程方便,并且在一定程度上相当于仅进入数据并单击提交按钮。然而,从工程角度来看,它采用编码机制来可靠地发送和接收来自客户端到服务器端的那个数据以进行后端处理。
对于本教程的范围,我们将专注于创建发送其数据的表单Application / X-WWW-Form-Urlencoded内容类型在Spring Web应用程序中。
2.表单数据编码
表单提交的最常用的HTTP方法是POST。但是,对于Idempotent.表单提交,我们也可以使用HTTP获取方法。并且,指定方法的方式是通过表单的方法属性。
对于使用Get方法的表单,整个表单数据将作为查询字符串的一部分发送。但是,如果我们使用POST方法,那么它的数据将作为HTTP请求主体的一部分发送。
而且,在后一种情况下,我们也可以使用表单指定数据的编码eNcType.属性,这可以采取两个值,即Application / X-WWW-Form-Urlencoded和多部分/表格数据。
2.1。媒体类型Application / X-WWW-Form-Urlencoded
HTML.表单有默认值Application / X-WWW-Form-Urlencoded为了eNcType.属性由于这需要保留数据完全文本的基本用例。尽管如此,如果我们的用例涉及支持文件数据,那么我们必须使用值覆盖它多部分/表格数据。
基本上,它将表单数据发送为由&符号(&)字符分隔的键值对。此外,相应的键和值与等于符号(=)分开。此外,使用所有保留和非字母数字字符进行编码百分比编码。
3.在浏览器中表单提交
既然我们有我们的基础知识,让我们继续前进,看看我们是如何能做的处理URL编码的表单数据,了解反馈提交的简单用例在春天的Web应用程序中。
3.1。域模型
对于我们的反馈表格,我们需要随着评论捕获提交者的电子邮件标识符。所以,让我们创造我们的域模型在一个反馈班级:
公共类反馈{私有字符串EmailID;私有字符串评论;}
3.2。创建形式
要使用简单的HTML模板来创建我们的动态Web表单,我们需要配置胸部叶在我们的项目中。在此之后,我们已准备好添加一个获得终点/反馈这将是服务反馈表格:
@getmapping(path =“/反馈”)公共字符串getfedbackform(模型模型){反馈反馈=新的反馈();model.addattribute(“反馈”,反馈);返回“反馈”;}
注意我们正在使用反馈作为捕获用户输入的模型属性。接下来,让我们创造反馈查看在反馈.html.html.模板:
当然,我们不需要明确指明eNcType.它将它选择默认值的属性Application / X-WWW-Form-Urlencoded。
3.3。PRG流量
当我们接受通过浏览器反馈表单的用户输入时,我们必须实施发布/重定向/获得(prg)提交工作流程,以避免重复的提交。
首先,让我们实现邮政端点/ web /反馈这将作为反馈表格的行动处理程序:
@postmapping(path =“/ web /反馈”,foodes = {mediatype.application_form_urlencoded_value})公共字符串handlebrowsummisions(反馈反馈)抛出异常{//保存反馈数据返回“重定向:/反馈/成功”;}
接下来,我们可以实现重定向端点/反馈/成功提供GOT请求:
@getmapping(“/反馈/成功”)公共anderthententity getuccess(){return new andertentity (“谢谢您提交反馈”。,httpstatus.ok);}
验证浏览器中表单提交工作流的功能,让我们访问localhost:8080 /反馈:

最后,我们还可以检查表单数据是否以URL编码的形式发送:
EmailID = ABC%40Example.com和注释= Sample +反馈
4.非浏览器请求
有时,我们可能没有基于浏览器的HTTP客户端。相反,我们的客户可能是一个实用程序,如卷曲或者邮差。在这种情况下,我们不需要HTML Web表单。相反,我们可以实现一个/反馈终端为POST请求提供服务:
@postmapping(path =“/反馈”,foodes = {mediatype.application_form_urlencoded_value})公共anderthentity handlenonbrowsubmisions(@requestbody反馈反馈)抛出异常{//保存反馈数据返回新andertentity (“谢谢您提交的反馈“,httpstatus.ok);}
在我们的数据流中没有HTML表单中,我们不一定需要实现PRG模式。然而,我们必须指定资源接受application_urlencoded_value.媒体类型。
最后,我们可以用卷曲请求测试它:
curl -x post \ http:// localhost:8080 /反馈\ -h'内容类型:application / x-www-form-ullencoded'\ -d'EmailId = abc%40example.com&注释= sample%20feedback'
4.1。FormHTTPMessageConverter.基本
发送的HTTP请求Application / X-WWW-Form-Urlencoded数据必须在此中指定此项内容类型标题。在内部,春天使用FormHTTPMessageConverter.类读取此数据并将其与方法参数绑定。
在我们的方法参数是类型的情况下多级美容,我们可以使用@RequestParam.或者@RequestBody.注释与HTTP请求的主体适当地绑定它。这是因为Servlet API将查询参数组合成一个名为的单个映射参数,并且包括自动解析请求正文:
@postmapping(path =“/反馈”,foodes = {mediatype.application_form_urlencoded_value})publice anderthentity handlenonbrowsummisions(@requestparam multivaluemap parammap)抛出异常{//保存反馈数据返回新andertentity (“感谢您提交反馈”,httpstatus.ok);}
然而,对于除此之外的方法参数多级Memap,如我们的反馈域对象,我们必须只使用@RequestBody.注解。
结论
在本教程中,我们简要了解了Web表单中表单数据的编码。金宝搏官网188be我们还探索了如何通过在Spring Boot Web应用程序中实现反馈表单来处理浏览器和非浏览器HTTP请求的URL编码数据。
一如既往,可以使用本教程的完整源代码在github上。