Spring Boot RestTemplate调用Power Automate发送Teams会议邀请报401错误
问题
我们在Power Automate中定义了用于发送Microsoft Teams会议邀请的工作流,尝试通过Spring Boot的RestTemplate调用该工作流时,出现「401 Unauthorized: [no body]」错误。以下是使用RestTemplate发送会议邀请的代码:
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MultiValueMap<String, String> data = new LinkedMultiValueMap<>(); data.add("SUBJECT", "xxx"); data.add("START_TIME", "xxx"); data.add("END_TIME", "xxx"); data.add("ATTENDEES", "xxx"); data.add("TEXT_BODY", "xxx"); HttpEntity<MultiValueMap> entity = new HttpEntity<>(data, headers); ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
而使用OkHttp调用同一工作流却能正常发送会议邀请,代码如下:
OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, "json formatted string content"); Request request = new Request.Builder().url(<<workflow-url>>).method("POST", body).addHeader("Content-Type", "application/json").build(); Response response = client.newCall(request).execute();
且使用OkHttp时未提供任何认证/授权信息,请问问题出在哪里?
原因与解决方案
问题核心在于RestTemplate的请求体格式与Power Automate工作流要求不匹配:
- 你设置了
Content-Type: application/json,但实际用MultiValueMap作为请求体时,RestTemplate会自动把它编码成application/x-www-form-urlencoded格式的表单数据,而非JSON格式。这导致Power Automate无法正确解析请求,进而返回401错误(实际是请求格式错误触发的权限校验误判)。 - OkHttp代码中直接传入了JSON格式的字符串作为请求体,符合工作流对
application/json格式的要求,所以能正常调用。
修正后的RestTemplate代码有两种方案:
方案1:直接传入JSON字符串作为请求体
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 构造符合要求的JSON字符串 String jsonBody = "{\"SUBJECT\":\"xxx\",\"START_TIME\":\"xxx\",\"END_TIME\":\"xxx\",\"ATTENDEES\":\"xxx\",\"TEXT_BODY\":\"xxx\"}"; HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers); ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
方案2:使用对象转JSON的方式(更规范)
- 先定义对应实体类:
public class MeetingRequest { private String SUBJECT; private String START_TIME; private String END_TIME; private String ATTENDEES; private String TEXT_BODY; // 构造方法、getter、setter省略 }
- 然后用RestTemplate发送JSON请求:
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); MeetingRequest meetingRequest = new MeetingRequest(); meetingRequest.setSUBJECT("xxx"); meetingRequest.setSTART_TIME("xxx"); meetingRequest.setEND_TIME("xxx"); meetingRequest.setATTENDEES("xxx"); meetingRequest.setTEXT_BODY("xxx"); HttpEntity<MeetingRequest> entity = new HttpEntity<>(meetingRequest, headers); ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
注:如果你的RestTemplate没有配置JSON消息转换器,需要手动添加
MappingJackson2HttpMessageConverter,确保能将对象正确序列化为JSON。
内容的提问来源于stack exchange,提问作者Venkata Madhu
相关产品推荐
相关产品推荐

