如何使用cURL发送带请求参数的POST请求?

时间:2018-01-20 11:44:05

标签: java curl spring-rest

我正在尝试使用cURL将POST请求发送到我的本地应用程序:

host="http://localhost:8080"
$(curl -s -X POST -H "Content-Type: application/json" -d '{"name":"Test", "description":"Test"}' $host/games/new?user_id=c13fb734-c72a-48a0-9fd7-5fbc79c6285a)

我的控制器:

@RequestMapping("games")
@RestController
public class GameController {

    private static final String ROOT_URL = ServerConfig.GAMES_HOST + "/games";

    @PostMapping(value = "new")
    public ResponseEntity<String> add(@RequestParam("user_id") UUID userId,
                      @RequestBody String newGame) {
        String url = ROOT_URL + "/new?userId=" + String.valueOf(userId);
        RestTemplate template = new RestTemplate();
        return template.postForEntity(url, newGame, String.class);
    }
}

但是在春天我遇到了错误:

{"errors":["user_id should be of type java.util.UUID"],"status":"BAD_REQUEST","message":"Failed to convert value of type 'java.lang.String' to required type 'java.util.UUID'; nested exception is java.lang.IllegalArgumentException: Invalid UUID string: new"}

即。 cURL将new作为user_id的值发送。 错误在哪里?

1 个答案:

答案 0 :(得分:1)

分析

长话短说,概念上,@RequestParam@RequestBody是互斥的:查询参数(@RequestParam)作为请求正文发送。

请在此处查看其他详细信息:

解决方案

目前,有两种选择:

  1. 仅限于请求参数(@RequestParam):将每个参数(即每个JSON属性)作为查询参数传递。
  2. 仅限于请求正文(@RequestBody),例如:

    1. 将所有内容作为JSON请求主体传递。
    2. 将所有内容作为JSON请求正文传递,user_id参数除外。参数可以设为@PathVariable@RequestMapping应使用适当的占位符来引用它。