Java Spring Controller обрабатывает нелепые URL - PullRequest
0 голосов
/ 27 октября 2018

Хорошо, поэтому я использую платежный сервис под названием Thrive cart, я делаю это для создаваемого веб-сайта. Когда пользователь заплатил, я хочу, чтобы его перенаправили на URL-адрес, где я могу использовать эти данные для обновления информации о текущих пользователях.

Данные, получаемые в параметрах, безумны:

http://localhost:5000/user/welcome?thrivecart%5Baccount_id%5D=3196&thrivecart%5Baccount_name%5D=testacount&thrivecart%5Bcustomer%5D%5Bemail%5D=testname8%40gmail.com&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bcountry%5D=GB&thrivecart%5Bcustomer%5D%5Baddress%5D%5Bzip%5D=pe303wu&thrivecart%5Border%5D%5B0%5D%5Bt%5D=product&thrivecart%5Border%5D%5B0%5D%5Bid%5D=6&thrivecart%5Border%5D%5B0%5D%5Bn%5D=Monthly+membership&thrivecart%5Border%5D%5B0%5D%5Bp%5D=799&thrivecart%5Border%5D%5B0%5D%5Bq%5D=1&thrivecart%5Border%5D%5B0%5D%5Bpo%5D=60120&thrivecart%5Border%5D%5B1%5D%5Bt%5D=product&thrivecart%5Border%5D%5B1%5D%5Bid%5D=6&thrivecart%5Border%5D%5B1%5D%5Bn%5D=Monthly+membership&thrivecart%5Border%5D%5B1%5D%5Bp%5D=799&thrivecart%5Border%5D%5B1%5D%5Bq%5D=1&thrivecart%5Border%5D%5B1%5D%5Bpo%5D=60120&thrivecart%5Border_currency%5D=GBP&thrivecart%5Border_id%5D=1041278&thrivecart%5Border_tax%5D=0.2&thrivecart%5Border_tax_id%5D=gb&thrivecart%5Border_total%5D=799&thrivecart%5Bpayment_processor%5D=paypal&thrivecart%5Bproduct_id%5D=6&thrivecart%5Bpurchases%5D%5B0%5D=6&thrivecart%5Bpurchases%5D%5B1%5D=6&thrivecart_hash=a5b711d2288b4cb587511811bc0a3473

Пока что я установил простой контроллер, который не попадет:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/welcome", method = RequestMethod.POST)
    public void welcomeMember(@PathVariable String data) {

        System.out.println(data);
    }   
}

Как мне справиться с такими сумасшедшими данными? Нужно ли указывать каждый параметр пути?

Ответы [ 4 ]

0 голосов
/ 27 октября 2018

Вопрос 1: До сих пор я установил простой контроллер, который не попадет:

Согласно вашему URL http://localhost:5000/user/welcome "user" - это имя контекста вашего проекта.Попробуйте удалить @RequestMapping("/user") из вашего класса.

Также вместо @PathVariable String data используйте @RequestParam Map<String,String> params.@PathVariable String data используется, когда данные являются частью URL, но в вашем случае это параметр.Окончательный код должен быть таким, как показано ниже.

    @RestController
    public class UserController {
        @RequestMapping(value = "/welcome", method = RequestMethod.POST)
        public void welcomeMember(@RequestParam Map<String,String> params ) {
            for(Map.Entry<String, String> entry : params.entrySet()){
             //This will print all paramters name and their value
             System.out.println(entry.getKey() + "-" + entry.getValue());
            }
        }   
    }

Вопрос 2: Как мне поступить с такими сумасшедшими данными, как это?Нужно ли указывать каждый параметр пути?

Я предлагаю следовать стандартной практике.Отправить данные в формате JSON.Это зависит от используемых вами технологий.Одним из способов является Ссылка

0 голосов
/ 27 октября 2018

Это похоже на проблему с тем, как остальные API-интерфейсы вызываются со стороны потребителя сервиса.

попробуйте отправить данные в теле запроса, а не в качестве параметра. Таким образом, вы можете использовать POJO для обработки данных.

0 голосов
/ 27 октября 2018

Прежде всего вы, похоже, получаете не элементы пути, а параметры запроса, поэтому вам понадобятся аннотации @RequestParam для получения значений.

Поскольку параметров запроса так много, я бы также порекомендовалвзять только один параметр, Map<String, String>.Эта карта будет содержать все параметры в виде пар ключ / значение, например:

  • ключ: "thrivecart [account_id]"
  • значение: "3196"

Если вы не уверены, получаете ли вы запрос POST или GET, вы также можете добавить второй параметр для получения HttpMethod.

Измените свой RestController на:

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/welcome")
    public void welcomeMember(@RequestParam Map<String, String> data, HttpMethod method) {
        System.out.println(method);
        System.out.println(data);
    }   
}
0 голосов
/ 27 октября 2018
@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/welcome/{data}", method = RequestMethod.POST)
    public void welcomeMember(@PathVariable("data") String data) {

        System.out.println(data);
    }   
}

попробуйте еще раз, как это

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