SpringBoot发送Post请求遇401未授权问题求助
解决RestTemplate POST请求返回401(SAS与Basic认证冲突)的问题
你遇到的核心问题是RestTemplate自动添加了Basic认证头,和URL中自带的SAS认证(sig参数)冲突了,这和Postman提示的错误完全吻合。另外你的代码里还有一个小问题:请求体没有正确传入HttpEntity中,这也可能影响请求的正常执行。下面一步步解决:
1. 修正请求实体构造:正确传递请求体
你当前的builderHeaders方法只返回了请求头,没有把构建好的请求体(map)放入HttpEntity中,这会导致接口收不到请求参数。修改相关方法:
private HttpEntity<?> buildBotRequestEntity(String email, StringBuilder message) { // 构建请求体 Map<String, String> body = new HashMap<>(); body.put("emailadress", email); body.put("emailSubject", "Pendência para lançamento de horas do Jira"); body.put("emailBody", message.toString()); // 构建请求头 HttpHeaders requestHeaders = new HttpHeaders(); requestHeaders.setContentType(MediaType.APPLICATION_JSON); // 把请求体和请求头一起封装成HttpEntity return new HttpEntity<>(body, requestHeaders); }
2. 阻止RestTemplate自动添加Basic认证头
RestTemplate如果在全局配置了BasicAuthenticationInterceptor,或者你的环境存在默认认证配置,就会自动在请求头里加Authorization: Basic xxx,这和URL里的SAS认证冲突。有两种解决方法:
方法A:为该请求单独创建干净的RestTemplate实例
如果你的全局RestTemplate有默认认证配置,最好为这个接口单独使用一个不带认证拦截器的实例:
private void sendBotMessage(StringBuilder message, String nome, String email) throws Exception{ try { String url = "https://prod-12.westeurope.logic.azure.com:443/workflows/fbf4c29cbcad4679b1a1159fff7b07f9/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=zxm46aQnBj3ZTKPOddnnwUgtQZoQcQfixNtXVxAJjPg"; // 创建无默认拦截器的RestTemplate RestTemplate restTemplate = new RestTemplate(); HttpEntity<?> requestEntity = buildBotRequestEntity(email, message); restTemplate.exchange(url, HttpMethod.POST, requestEntity, Void.class); logger.info("Bot enviado com sucesso! " + nome); } catch (Exception e) { logger.error("Erro ao enviar Bot.", e); throw e; } }
方法B:显式清除Authorization请求头
如果不想新建RestTemplate,可以在请求头里显式移除或清空Authorization,覆盖自动添加的头:
在构建请求头的部分添加:
// 移除自动添加的Authorization头 requestHeaders.remove(HttpHeaders.AUTHORIZATION); // 或者直接设为null requestHeaders.set(HttpHeaders.AUTHORIZATION, null);
3. 验证请求头(可选)
可以在发送请求前打印请求头,确认没有多余的Authorization头:
System.out.println("Request Headers: " + requestHeaders);
调整后,请求就只会使用URL中的SAS认证,不会再携带Basic认证头,同时请求体也能正确传递,应该就能解决401的问题了。
内容的提问来源于stack exchange,提问作者user2424634
相关产品推荐
相关产品推荐

