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

Postman调用Sailpoint IdentityNow API正常,SpringBoot返回400错误

问题:SpringBoot调用Sailpoint IdentityNow API返回400错误,Postman调用正常

对接Sailpoint IdentityNow API时,Postman调用端点/beta/identities?filters=alias eq “123456”可正常获取响应,但将SpringBoot项目中已废弃的API替换为该端点后,调用始终返回400错误。调试打印的URL复制到Postman能正常请求,但代码调用就是无法成功。

错误日志

2024-03-22 15:39:51,991 DEBUG com.mycompany.contractormgmt.service.IDNService - IDN User details URL: https://mycompany-sb.api.identitynow.com/beta/identities?filters=alias%20eq%20%22abcxyz%22
2024-03-22 15:39:52,093 DEBUG com.mycompany.contractormgmt.service.IDNService - IDNService :: getUserDetailsFromIDN :: HttpStatusCodeException = org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : 
"{\"detailCode\":\"400.1 Bad request content\",\"trackingId\":\"96f48240c65042ba95d963814350cdf9\",\"messages\":[{\"locale\":\"en-US\",\"localeOrigin\":\"DEFAULT\",\"text\":\"The request was syntactically correct but its content is semantically invalid.\"},{\"locale\":\"und\",\"localeOrigin\":\"REQUEST\",\"text\":\"The request was syntactically correct but its content is semantically invalid.\"}],\"causes\":[]}"

代码片段

String authHeader = "Bearer " + authService.getIDNAccessToken();
logger.trace("IDNService :: getUserDetailsFromIDN :: Bearer authHeader = " + authHeader);

HttpHeaders headers = new HttpHeaders();
headers.add(ContractorManagementConstants.AUTHORIZATION, authHeader);
headers.add(ContractorManagementConstants.ACCEPT, MediaType.APPLICATION_JSON_VALUE);

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(config.getIdn().getUserDetails().getUrl())
        .queryParam("filters", "alias eq \"" + userWWID + "\"");

logger.debug("IDN User details URL:" +builder.toUriString());

HttpEntity<String> entity = new HttpEntity<>(headers);
logger.debug("Headers : " +entity.getHeaders());
RestTemplate restTemplate = new RestTemplate();
try {
    ResponseEntity<IDNResponse> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, entity,
            IDNResponse.class);

    logger.debug("IDNService :: getUserDetailsFromIDN :: response = " + response);

解决方案

  • 修正URL编码处理方式:
    UriComponentsBuilder的queryParam方法会自动对参数值做URL编码,直接传递完整的filter表达式即可,无需手动拼接后再让builder处理。同时建议直接使用URI对象而非字符串发起请求,避免字符串解析时的编码异常:

    // 构建filter表达式
    String filterExpr = String.format("alias eq \"%s\"", userWWID);
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(config.getIdn().getUserDetails().getUrl())
            .queryParam("filters", filterExpr);
    
    // 改用URI对象发起请求
    ResponseEntity<IDNResponse> response = restTemplate.exchange(builder.build().toUri(), HttpMethod.GET, entity, IDNResponse.class);
    
  • 核对请求头一致性:
    对比Postman中的请求头与代码中的配置,确保Accept、Authorization等核心头完全一致。若Postman中添加了Content-Type头(尽管GET请求通常不需要),也可以尝试在代码中补充:

    headers.add(ContractorManagementConstants.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
    
  • 检查RestTemplate配置:
    默认RestTemplate可能存在消息转换器或拦截器干扰请求,可尝试初始化一个干净的RestTemplate实例,或添加明确的字符串消息转换器:

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
    
  • 确认引号格式:
    确保代码中使用的是英文双引号",而非中文引号“”,避免语义解析错误。

内容的提问来源于stack exchange,提问作者user2961454

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:54:52