从 HTML 表单中获取 spring-boot REST 请求参数中的 null

Posted

技术标签:

【中文标题】从 HTML 表单中获取 spring-boot REST 请求参数中的 null【英文标题】:Getting null in spring-boot REST request param from HTML form 【发布时间】:2020-04-03 14:08:51 【问题描述】:

我有一个 html 表单,我在其中获得 2 个输入,它被提交到 spring boot REST api。但在这个简单的应用程序中,我仍然在后端 api 中收到 null 作为请求。

表格

<div>
    <label>alphaID</label>  
    <div>
        <input id="alphaID" name="alphaID" type="text"/>
    </div>
</div>

<div>
    <label class="col-md-4 control-label">Domain Name</label>  
    <div class="col-md-4">
        <input id="domain" name="domain" type="text"/>
    </div>
</div>

提交后,我正在调用 ajax 调用,例如:

function formSubmit() 
    $("#productForm").submit(function(e) 
        e.preventDefault();
        var requestJson = createRequestJSON();
        var url = config.myurl;
        $.ajax(
            url: url,
            type : "POST",
            data: JSON.stringify(requestJson),
            success: function( data, textStatus, jQxhr ) 
                console.log("sucess: " + data);
            ,
            error: function( jqXhr, textStatus, errorThrown )
                console.log( "error: " + errorThrown );
            
        );
    );

后端是一个带有 REST 调用的 spring-boot 应用程序:

@RequestMapping(value = "/validate", method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public Map<String, List<String>> validate(@Valid MyDTO myDTO) 

    System.out.println(myDTO.getId());          // GETTING null
    System.out.println(myDTO.getDomain());      // GETTING null


MyDTO.java

public class MyDTO 
    @JsonProperty("alpha_id")
    private String alphaID;

    @JsonProperty("domain")
    private String domain;

    ....

【问题讨论】:

【参考方案1】:

看看你的requestJson 是否真的有正确的格式以便MyDTO 使用它可能会很有趣。

您也不必Json.stringify您的数据。当你这样做时,你基本上只是向后端发送一个字符串。后端不知道它必须解析这个字符串才能得到一个有效的文档。您要么直接在 data 属性中发送 javascript 对象,要么将 API 更改为期望 String 并稍后在函数中解析它。

【讨论】:

【参考方案2】:

将您的 Content-Type 更改为

consumes = MediaType.APPLICATION_JSON_VALUE

添加@RequestBody注解

public Map<String, List<String>> validate(@Valid @RequestBody MyDTO myDTO)

确保您调用正确的 URL 并从浏览器请求中发送正确的 content-type

【讨论】:

那么从浏览器,我应该发送application/json,对吧? 我进行了更改,但出现错误:Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported] 参考这篇文章在 Ajax 调用中添加 content-typeAccept 标头。 ***.com/questions/9754767/…

以上是关于从 HTML 表单中获取 spring-boot REST 请求参数中的 null的主要内容,如果未能解决你的问题,请参考以下文章

如何从 mongodb 到 html 表单字段中获取数据?

Gatling:从 HTML 表单中获取信息

Django:从 HTML 中获取 LIST 数据,无需表单或模型

使用 Bottlepy 从 HTML 表单中获取 INT 值

从 HTML 表单的输入中获取修改后的文本

无法从 PHP 中的 HTML 表单获取 POST 值