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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:32:47