如何在Java的rest调用中将Map作为requestBody发送

时间:2019-01-09 15:04:38

标签: java json rest spring-boot spring-annotations

我有一个休息端点,它使用RequestParam和RequestBody作为参数。在客户端,我正在使用javax客户端来调用此其余端点,但是由于响应代码405来自服务器,因此出现了问题。

这是springBoot rest端点代码:

@RequestMapping(value = "/run", method = RequestMethod.POST, consumes = "application/json")
    public ReportRunResult runBackendCall(@RequestParam(name = "clientName", required = true) String reportName,
                                     @RequestBody Map<String, ReportParameter> formParams) {
        return service.runReport(reportName, formParams);
    } 

这是我从客户端调用此终结点的方式:

 public ReportRunResult runBackendCall(String name, Map<String, ReportParameter> parameters) {

  ReportRunResult reportResponse = null;
        WebTarget target = RestClientBuilder.clientBuilder(RestClientBuilder.buildSSLContext(), 3000, 10000).build()
                .target(serverURL.get() + "/run?reportName=" + name);

        Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_JSON_TYPE);
        Response response = target.request(MediaType.APPLICATION_JSON_TYPE).post(Entity.json(parameters));

        reportResponse = response.readEntity(ReportRunResult.class);
        log.info("response. " + response.getStatus() + " ");   
    }

我不明白为什么服务器发送响应405是否需要在Entity.json(parameters))中将Map(parameters)转换为json字符串? ?

2 个答案:

答案 0 :(得分:1)

状态代码withRouter(Invoice)告诉您405,因此您的HTTP-Method可能有问题。

您将Method Not Allowed用作WebTarget的{​​{1}}中的代码也存在故障,但是REST服务希望将reportName用作{{1 }}。

所以改变

RequestParam

clientName

答案 1 :(得分:0)

您可以像这样使用JSONObject:

new JSONObject(map)

PS:地图应为Map<String,String>

类型