在Spring MVC中显式使用POST请求值

时间:2017-08-14 05:34:43

标签: java spring spring-mvc curl

我有一些使用Spring MVC项目生成加密货币钱包的代码。

@RequestMapping(value = "/generateAddress", method = RequestMethod.POST)
public ResponseEntity<WalletInfoWrapper> generateAddress(@RequestParam("walletName") String walletName,
                                                         @RequestParam("currencyName") String currencyName, HttpServletRequest request) {

    String wallet_Name = request.getParameter("walletName");
    String currency_Name = request.getParameter("currencyname");

    System.out.println("wallet_Name = " + wallet_Name + " , currency_Name = " + currency_Name);

    // return if the wallet name or the currency is null
    if (Objects.isNull(wallet_Name) || Objects.isNull(currency_Name)) {
        return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
    }

    WalletInfo walletInfo = walletService.generateAddress(wallet_Name);

    if (Objects.isNull(walletInfo)) {
        return new ResponseEntity<WalletInfoWrapper>(HttpStatus.NOT_ACCEPTABLE);
    }

    WalletInfoWrapper walletInfoWrapper = new WalletInfoWrapper();
    walletInfoWrapper.setName(walletInfo.getName());

    return new ResponseEntity<WalletInfoWrapper>(walletInfoWrapper, HttpStatus.CREATED);
}

现在,我发出此POST请求,

curl -X POST -d "walletName=zyx&currencyName=bitcoin" http://localhost:8080/rest/generateAddress

我希望wallet_Namecurrency_Name按照代码中的规定分开并打印。但是,在我发出POST请求后,我在控制台中看不到任何内容。

        String wallet_Name = request.getParameter("walletName");
        String currency_Name = request.getParameter("currencyname");

        System.out.println("wallet_Name = " + wallet_Name + " , currency_Name = " + currency_Name);

我还尝试POST使用JSON格式的数据,但我没有改变。这里的问题是什么?

2 个答案:

答案 0 :(得分:6)

首先,我建议您切换使用System.out.println并使用适当的记录器,例如slf4j,因为您可能希望在某一点上将所有输出语句都放到文件。

关于如何使用spring mvc,有些不对。 由于您已经为两个字段声明了@RequestPAram,为什么不直接使用它们而不是request.getPrameter("blah")。因此,我建议您删除@RequestParam并使用HttpServletRequest,反之亦然。

我在这里看到的另一件事String currency_Name = request.getParameter("currencyname");你犯了一个错误。你应该做request.getParameter("currencyName")(观察N大写)。

以下是我的请求示例。我使用@RequestParam并使用request.getParameter()添加了两者。这是您想要使用的选择。现在的建议是使用@RequestParam

@RestController
public class WalletController {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @RequestMapping(value = "/generateAddress", method = RequestMethod.POST)
    public ResponseEntity<String> generateAddress(@RequestParam("walletName") String walletName,
                                                  @RequestParam("currencyName") String currencyName, HttpServletRequest request) {
        logger.info("walletName {} and currencyName {}", walletName, currencyName);
        String wallet_Name = request.getParameter("walletName");
        String currency_Name = request.getParameter("currencyName");
        logger.info("walletName {} and currencyName {}", wallet_Name, currency_Name);

        // DO other Stuff
        return ResponseEntity.ok(null);
    }
}

测试请求:

curl -X POST -d "walletName=my-cool-wallet&currencyName=ETH" http://localhost:8080/generateAddress

观看日志:

2017-08-14 10:11:29.972  INFO 29228 --- [nio-8080-exec-1] c.s.s.controller.WalletController        : walletName my-cool-wallet and currencyName ETH
2017-08-14 10:11:29.972  INFO 29228 --- [nio-8080-exec-1] c.s.s.controller.WalletController        : walletName my-cool-wallet and currencyName ETH

答案 1 :(得分:-2)

我认为您应该直接在URL中使用查询参数执行POST,如下所示,因为您尝试传递多个参数。

curl -X POST http://localhost:8080/rest/generateAddress?walletName=zyx&currencyName=bitcoin