当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring正确接收urlencoded表单体

严狐若
2023-03-14

我刚刚开始使用Spring,我正在尝试在rest控制器中接收一个表单urlencoded POST body,但我一生都无法让它工作。这是我的“Hello World”式控制器:

@RestController
public class MyController {
    @ResponseBody
    @RequestMapping(
        value = "/",
        method = RequestMethod.POST,
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
        produces = MediaType.TEXT_PLAIN_VALUE
    )
    public String index(@RequestBody String text) {
        return "Text: " + text;
    }
}

我尝试了许多不同的变体,都有不同的错误。当从Postman接收到带有“text”参数的POST请求时,上面的特定配置会产生以下错误。

Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.mywebsite.controllers.MyController.index(java.lang.String)

我看过许多其他关于这个主题的stackoverflow帖子,并试图实现它们的各种解决方案,但都没有效果。以下是最有希望的方案:

  • Spring JSON请求正文未映射到Java POJO
  • 在那篇文章的第一个解决方案之后,使用MultiValueMap会产生与上述相同的错误。
  • 第二次,参数映射每次为空。
  • 生成一个空贴图,类似于上面的贴图

还有几个我再也找不到了,对于这些帖子中的大多数,我每次都尝试调整注释。当我尝试GET和JSON POST请求时,我取得了巨大的成功,但是由于某种原因,这些urlencoded请求拒绝工作。

共有2个答案

魏俊茂
2023-03-14

这就是我设法解决问题的方法

@RequestMapping(value = "/test/", method = RequestMethod.POST, headers = {"content-type=application/x-www-form-urlencoded"})
public void waboxapp(WebRequest request) {
    // then use something like:
    log.debug("request payload: " + request.getParameter("data"));
}
司马德水
2023-03-14

如果要qet单个post参数,只需使用Request estParam:

public String index(@RequestParam("text") String text) {
    return "Text: " + text;
}

如果要一次获取多个参数,请创建一个命令类,并使用与参数匹配的JavaBean属性:

public class Command {
    private String text;
    private Integer number;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }
}

并将其作为参数传递给您的方法:

public String index(Command command) {
    return "Text: " + command.getText();
}
 类似资料:
  • 问题内容: 我正在使用Spring 4.0.0.RELEASE,Spring Data Commons 1.7.0.M1,Spring Hateoas 0.8.0.RELEASE 我的资源是一个简单的POJO: 我的资源汇编器将User对象转换为UserResource对象: 在我的UserController内,我想从我的服务中检索,然后将其转换为. 这不会调用,只是User返回的内容而不是我的

  • 我正在使用Spring 4.0.0. RELEASE,Spring数据共享1.7.0. M1,Spring Hateoas 0.8.0. RELEASE 我的资源是一个简单的POJO: 我的资源汇编程序将User对象转换为UserResources对象: 在我的UserController我想检索

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器

  • 问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需

  • 问题内容: 我最近开始使用ScriptManager。我有一个通过JavaScript填充的ASP.NET DropDownList控件。但是,我正在使用事件验证。因此,如果我不使用下拉菜单中的“ RegisterForEventValidation”调用,则会遇到以下错误。我怎么知道在第二个参数中设置什么值(我有“值”)?我正在通过JavaScript填充下拉列表,因此我不知道后面的代码中包含哪