【问题标题】:Required String parameter 'x' is not present必需的字符串参数“x”不存在
【发布时间】:2019-05-09 15:17:34
【问题描述】:

我有一个无法更改的 spring API,它的 post listener 如下所示:

@PostMapping("upload")
    public String register(@RequestParam("x") String x, 
@RequestParam("y") String y) {//dostuff}

现在我身边有另一个 Spring-boot API,它需要在构造时发送 POST 请求,而 post 请求如下所示:

  String response = 
(String) rest.postForObject(url,objectWrapper,String.class);

ObjectWrapper 看起来像这样:

public class ObjectWrapper {
   private String x;
   private String y;

  public ObjectWrapper(String x, String y) {
      this.x= x;
      this.y = y;
     }
 }

上面的post请求执行时,我这边抛出异常

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 null

使用 JSON/应用程序从邮递员发帖时,错误是必需的字符串参数“x”不存在。

但是,当 x 和 y 在 params 而不是 body 中时,它会从邮递员成功发送。

当我在 Spring 中将其硬编码为发布请求中 url 的一部分时,它也是成功的

  url + "/upload?x=test&y=test"

我的问题是,如何通过 Post 请求将这两个字符串从我的 Spring 服务器发送到另一个。我不能改变听众。提前致谢。

【问题讨论】:

    标签: java spring spring-boot spring-mvc


    【解决方案1】:

    用作@RequestParam的参数是查询参数,不能像你做的那样传入requestBody。它们需要动态附加到 url。这可以通过以下方式完成。

      String url = baseUrl + "/upload?x={x}&y={y}";
    
      Map<String, String> uriVariables = new HashMap();
      uriVariables.put("x", "valueForX");
      uriVariables.put("y", "valueForY");
    
      String response = rest.postForObject(url, null, String.class, uriVariables);
    

    这里的 RequestBody 可以为空,因为您的 API 不接受任何 requestBody,所以它被指定为空。

    postForObject 方法的文档可以在here 找到。

    你甚至可以使用 Spring 的 UriBuilder 来构建一个带有 queryParams 的 url。有关更多信息,请参阅其文档 here

    【讨论】:

      【解决方案2】:

      我认为您误解了@RequestParam 的用途。变量应该在 url 中(/upload?x=test&y=test 可以),而不是在正文中。

      如果你想把这个变量放在body中,选择一种格式(例如JSON),创建一个对象,把json放在body中,并将对象标记为@RequestBody:

      @PostMapping("upload")
      public String register(@RequestBody MyObj myObj) {//dostuff}
      

      【讨论】:

      • 您好,感谢您的回复。假设提供 API 侦听器的人希望在 URL 中包含这些,鉴于 x 和 y 的值会不同,我如何使用 x 和 y 的正确值动态更改 url?
      猜你喜欢
      • 2019-09-23
      • 2021-04-01
      • 2018-05-03
      • 2017-11-27
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多