【问题标题】:Passing a String[] from react to springboot将 String [] 从 react 传递到 spring boot
【发布时间】:2021-12-30 22:19:48
【问题描述】:

我想将一个 String 用户名数组从 react 传递给 Spring,以便我可以获取每个用户名的一些用户详细信息,最后将其传递回以作为 List<String> 作出反应

到目前为止,我正在制作一个用户名数组,然后将它们作为请求正文传递给 spring

        const roundRobin = () => {
        const userList = []
        //Get list of entrants usernames to pass to backend
        for(let i =  0; i < entrants.length; i++){
          userList.push(entrants[i].username);
          console.log(userList);
        }
        const List = JSON.stringify(userList) 

        //API call
        apiCalls
        .getRandomUserList(List)
        .then((response) => {
          console.log(response.data);
        })
        .catch((apiError) => {
          if (apiError.response.data && apiError.response.data.validationErrors) {
            setEditErrors(apiError.response.data.validationErrors);
          }
          console.log(apiError.response.data)
          setPendingApiCall(false);
        });
        
      }

在春季,我的控制器将请求正文作为String[]

//create a random list of members who have entered an event
    @CrossOrigin
    @GetMapping("/users/createRandomList")
    List<String> randomList(@RequestBody String[] usernames) {
        return userService.createRandomUserList(usernames);
    }

UserService 然后获取String[] 并将其更改为一个 List 并调用一个随机重新排列字符串顺序的方法,然后循环遍历返回的 List(这是一个用户名)并从中获取 User数据库并将有关该用户的一些详细信息添加到新列表中,然后返回以做出反应。

public List<String> createRandomUserList(String[] randomUsernames) {
        List<String> users = new ArrayList<>();
        List<String> randomUsersList = Arrays.asList(randomUsernames);
        List<String> randomUsers = getRandomUsers(randomUsersList);
        for (String randUsernames : randomUsers) {
            User u = userRepository.findByUsername(randUsernames);
            users.add(u.getFirstname() + " " + u.getSurname() + " " + u.getHandicap());
        }
        return users;

    }

    //Create list of entrants IDs in random order for tee times.
    public List<String> getRandomUsers(List<String> userIds) {
        int size = userIds.size();
        List<String> passedList = userIds;
        List<String> entrants = new ArrayList<>();
        Random rand = new Random();
        for(int i = 0; i < size; i++) {
            int randomIndex = rand.nextInt(passedList.size());
            entrants.add(passedList.get(randomIndex));
            passedList.remove(randomIndex);
        }
        return entrants;
    }

当我尝试在我的网络应用程序中运行它时,我收到了 HTTP 400 错误,

{timestamp: 1640902047907, status: 400, message: 'Required request body is missing: java.util.List<j…ser.UserController.randomList(java.lang.String[])', url: '/api/1.0/users/createRandomList'}

我不确定我做错了什么,据我所知,我正在将一个数组传递给 Spring,当我 console.log(List) 时,我得到["user1","user2"]

【问题讨论】:

  • 听起来List 没有正确放入请求正文中。您的getRandomUserList 代码看起来如何?
  • 嗨,这是我最初的问题。我想我可能已经找到了一个解决方案,通过一些阅读,建议我们不要将 RequestBody 与 Get 请求一起使用,所以我已将其更改为 RequestParam,如果我将列表作为参数发送,它现在工作正常在 api 调用中
  • 哦,甚至没有意识到您的端点是 GET。是的 GET 请求不能有正文。
  • 端点名称/users/createRandomList 不遵循 REST 规则,请参阅“使用名词命名 URI”。例如,您应该将其命名为 /users?random
  • @HanchenJiang 所有的请求都可以有一个body甚至get请求,但是根据REST主体发送一个带有get请求的body是一种不好的做法。一个好的做法是发送带有 POST 请求的正文

标签: java arrays reactjs spring-boot


【解决方案1】:

我觉得你应该把get映射改成post映射,然后用List代替String[],这样试试

@CrossOrigin
    @GetMapping("/users/createRandomList")
    List<String> randomList(@RequestBody List<String> usernames) {
        return userService.createRandomUserList(usernames);
}

也根据变化改变服务方式

【讨论】:

  • 您的回答保留了@GetMapping,但我知道您的意思。谢谢
  • 抱歉,应该是后期映射
猜你喜欢
  • 2020-08-06
  • 2018-09-11
  • 1970-01-01
  • 2019-09-27
  • 2017-02-10
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多