You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的方式(更规范)

  1. 先定义对应实体类:
public class MeetingRequest {
    private String SUBJECT;
    private String START_TIME;
    private String END_TIME;
    private String ATTENDEES;
    private String TEXT_BODY;

    // 构造方法、getter、setter省略
}
  1. 然后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:55:18