通过POST从React App发送数组到Spring Boot

时间:2018-10-25 13:47:39

标签: java spring-boot axios

我已经看到类似的问题,但没有成功。 我需要将数字矩阵从Web应用程序(ReactJS)发送到Spring Boot控制器。

我尝试了很多组合,但是总会出错,我的有效载荷是:

{"rows":[[7,0,0,6,4,0,0,0,0],[9,4,0,0,0,0,8,0,0],[0,8,6,2,5,0,0,9,0],[0,0,0,0,6,8,7,3,0],[4,0,8,0,2,1,0,0,0],[0,0,3,0,0,0,1,6,4],[0,0,0,0,0,9,6,7,5],[3,9,0,0,8,5,0,1,2],[0,0,5,0,0,4,0,0,0]]}

我的反应代码是:

axios.post('http://localhost:8090/api/check', {
        rows: this.props.rows
    })
        .then(function (response) {
            console.log(response);
        })
        .catch(function (error) {
            console.log(error);
        });

我的Spring Boot控制器是:

@PostMapping(path = "/check")
@CrossOrigin(origins = "http://localhost:3000")
public boolean check(@RequestParam(value = "rows") final int[] array, final int row, final int col, final int num) {
    return true;
}

我已经尝试声明@RequestParam(value = "rows[]")@RequestParam(value = "rows")。 而不是@RequestParam(value = "rows") final Object rows

但是它总是以错误400(错误请求)作为响应。

如何通过POST请求传递矩阵?

谢谢

2 个答案:

答案 0 :(得分:3)

最后,我解决了将所有参数包装在一个对象中的问题。

@JsonAutoDetect
public class Params {

    private int[][] matrix;
    private int row;
    private int col;
    private int num;

    [...getters and setters]

然后在控制器的方法符号中仅声明一个参数:

    @PostMapping(path = "/check")
    @CrossOrigin(origins = "http://localhost:3000")
    public boolean check(@RequestBody final Params params) {
        return sudokuGenerator.checkValue(params.getMatrix(), params.getRow(), params.getCol(), params.getNum());
    }

至关重要的是,客户端应该传递带有其属性的对象,而没有任何类型的包装器,因此采用这种方式:

axios.post('http://localhost:8090/api/check', {
     matrix: this.props.rows,
     "row": row - 1,
     "col": col - 1,
     "num": input.textContent
})

不是这样(带有根属性“ params”):

axios.post('http://localhost:8090/api/check', {
     "params" : {
         matrix: this.props.rows,
         "row": row - 1,
         "col": col - 1,
         "num": input.textContent
     }
})

答案 1 :(得分:0)

我建议将变量“行”转换为一个int [] []数组,这就是json表示的含义。

此外,在我的Spring Web应用程序中,我不需要通过注释声明请求参数。尝试删除Annotation(Spring会检测到参数本身)。 另外,删除所有未包含在json(请求数据)中的方法参数。

@PostMapping(path = "/check")
@CrossOrigin(origins = "http://localhost:3000")
public boolean check(int[][] array) {
    return true;
}

如果要使用注释,请使用@RequestBody进行POST调用,@ RequestParameter读取GET-Parameter(从类似... / bla?param1rows = [[0,0]]的URL)