繁体   English   中英

Java RestTemplate 如何与正文一起发布

[英]Java RestTemplate how to POST with body

我需要有关在 RestController 中使用 RestTemplate 发布 json 主体的正确方法的一些帮助。 我只是对自己做错了什么还不够熟悉。 我花了很多时间来研究这个,但我没有得到我需要的结果。 希望我提供的信息很清楚。 截至目前,我只是想将 JSON 主体发布到下面的 URL API

CONTROLLER

@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

  private final RestTemplate restTemplate;

  @Autowired
  public FeedbackController(RestTemplate restTemplate) {
    this.restTemplate = restTemplate;
  }
  
  @RequestMapping(          
            method = RequestMethod.POST
            )
  public IncidentReport createIncident()      
  {  
      
    return restTemplate.exchange(
        "URL_API/create",
        HttpMethod.POST, null,
        new ParameterizedTypeReference<IncidentReport>(){}
                
    ).getBody();
  } 

JSON 柱体

 {
"group": "my_group",
"short_description":"this is a test for the short description",
"contact_type":"Alert",
 }

exchange是低级的方法,更具体的方法通常更友好,只要它们涵盖您的用例即可。 您正在寻找一个postForObjectpostForEntity如果您需要标题):

return restTemplate.postForObject(url, incidentObject, IncidentReport.class);

StackTrace 会更有帮助。 我认为你应该以下面的方式实例化 RestTemplate 。

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMillis(3000))
            .setReadTimeout(Duration.ofMillis(3000))
            .build();
}

然后将其自动连接到您的 Controller class

 @Autowired
private RestTemplate myRestTemplate;

确保 Jackson 库存在于类路径中。 尝试使用 myRestTemplate.postForObject()。 这没什么。 如果您仍然遇到问题,请尝试分析堆栈跟踪,您会得到一些提示。

由于 spring 启动自动配置RestTemplateObjectMapper以在您的@RestController端点中序列化/反序列化,因此您根本不必坚持使用RestTemplate并且可以使用以下代码片段中所示的功能:

@RestController
@RequestMapping("/api/feedback")
public class FeedbackController {

    @Autowired private FeedbackFacade feedbackFacade;

    @PostMapping("/")
    public ResponseEntity<IncidentReport> createIncidentReport(
            @RequestBody IncidentReport incidentReport)
    {
        log.info("Create incident report {}", incidentReport);
        var createdIncidentReport = feedbackFacade.create(incidentReport);
        log.info("Created incident report: {}", createdIncidentReport);
        return new ResponseEntity<>(createdIncidentReport, HttpStatus.CREATED)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM