Отправка массива через POST из приложения React в Spring Boot - PullRequest
0 голосов
/ 25 октября 2018

Я уже видел подобный вопрос без успеха.Мне нужно отправить матрицу чисел из веб-приложения (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 голосов
/ 26 октября 2018

Наконец, я решил обернуть все параметры в один объект.

@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
     }
})
0 голосов
/ 25 октября 2018

Я бы предложил превратить ваши переменные "rows" в массив int [] [], потому что это то, что представляет ваш json.

Кроме того, в моем весеннем веб-приложении мне не нужно объявлятьпараметр запроса по аннотации.Попробуйте удалить аннотацию (Spring определит сам параметр).Также удалите все параметры метода, которые не включены в json (данные запроса).

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

Если вы хотите работать с аннотациями, используйте @RequestBody для вызовов POST, @RequestParameter читает GET-Parameter (из URL как ... / bla? param1rows = [[0,0]])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...