发送 POST 到 Spring 端点给出状态 400

问题描述 投票:0回答:2

似乎在 React 应用程序中将 playerId 参数从前端传递到后端时出现问题。 Spring 控制器中的 createGame 函数设置为接收 playerId 参数,但该值未使用 Axios 从前端正确传递。已尝试对 playerId 使用 Long 和 String,但问题仍然存在。 仍在获得状态 400!

Spring

React

  1. 将其存储为字符串参数。
  2. 我使用了@PathVariable。
  3. 我试过在Postman中直接写参数
  4. 我尝试更改端点。
  5. 我没有显示的另一个端点(/登录)工作正常,所以代理没有问题。
java reactjs spring go post
2个回答
1
投票

Daniel 的回答 是正确的,但我这样重写代码:

@PostMapping("/games")
public ResponseEntity<String> createGame(@RequestBody Map<String, Object> requestParams) {
    try {
        Long playerId = Long.parseLong(requestParams.get("playerId").toString());
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
        String gameCreated = now.format(formatter);
        Player player = playerRepository.findById(playerId).orElse(null);
        if (player == null) {
            return ResponseEntity.notFound().build();
        }
        Game game = new Game(gameCreated);
        gameRepository.save(game);
        GamePlayer gamePlayer = new GamePlayer(game, player);
        gamePlayerRepository.save(gamePlayer);
        return ResponseEntity.ok("Game created successfully!");
    } catch (Exception e) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to create game.");
    }
}

React 将像这样发送:

const handleClick = async () => {
    try {
      const response = await axios.post(`/api/games?playerId=${parseInt(storedPlayerId)}`);
      console.log(response.data);
    } catch (error) {
      console.log(error.response.data);
      // handle the error
    }
};

0
投票

在共享的 React 屏幕截图中 - 看起来您发送了一个 JSON 正文。

但是,在 Spring Controller 中 - 使用@RequestParam。

看起来您要么需要更改 React 部分以调用类似“/api/games/{playerId}”的 URL(因此 playerId 将作为 URL 的一部分传递)或更新 Spring Controller 以接受 @RequestBody(并创建一个类field 'playerId') - 所以整个对象可以作为请求主体传递。

目前 React 发送一个主体——但是 Spring 正在寻找一个 URL 查询参数。两个部分都需要做同样的事情——不管它是什么。

春天的变化看起来像:

public ResponseEntity<String> createGame(@RequestBody PlayerRequest playerRequest) {
    Long playerId = playerRequest.getPlayerId();
    // other code goes here
}

public class PlayerRequest {
    private Long playerId;

    public Long getPlayerId() {
        return playerId;
    }

    public void setPlayerId(Long playerId) {
        this.playerId = playerId;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.