Java 在RESTAPI请求中包含URL地址时RestTemplate出现问题

Java 在RESTAPI请求中包含URL地址时RestTemplate出现问题,java,spring,rest,spring-boot,resttemplate,Java,Spring,Rest,Spring Boot,Resttemplate,我试图从Botify的RESTAPI中获取数据,以便在项目中使用它,这也是一个RESTAPI。我正在使用Spring的RestTemplate类的一个实例向Botify发出实际请求,特别是.exchange方法,因为我需要将Botify的密钥作为头参数传递 当我需要调用端点的方法时,我的问题就出现了,该方法将URL作为请求URI的一部分(而不是参数)。此端点的文档位于中 请求的结构基本上如下所示: /分析/{username}/{project_slug}/{analysis_slug}/url

我试图从Botify的RESTAPI中获取数据,以便在项目中使用它,这也是一个RESTAPI。我正在使用Spring的RestTemplate类的一个实例向Botify发出实际请求,特别是.exchange方法,因为我需要将Botify的密钥作为头参数传递

当我需要调用端点的方法时,我的问题就出现了,该方法将URL作为请求URI的一部分(而不是参数)。此端点的文档位于中

请求的结构基本上如下所示:

/分析/{username}/{project_slug}/{analysis_slug}/url/{url}

URI的最后一部分是URL地址,需要用UTF-8编码,以便将其与实际请求分开

问题是(我相信,.exchange方法总是对请求进行编码,所以我尝试这样发送:

/分析/myusername/myprojectname/myprojectslug/url/https%3A%2F%2Fwww.example.com

…结果是这样的:

/分析/myusername/myprojectname/myprojectslug/URL/https%253A%252F%252Fwww.example.com'

这显然不起作用。这是调用Botify的方法的摘录:

public String callBotifyEndpoint(String reportType, String parameters) throws UnsupportedEncodingException {
    String request = this.baseUri + "/analyses/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com"

    HttpHeaders headers = new HttpHeaders();
    headers.set("Authorization", "Token " + this.apiKey);
    HttpEntity<String> entity = new HttpEntity<>(headers);

    UriComponentsBuilder botifyQueryBuilder = UriComponentsBuilder.fromUriString(request);      
    String queryStringBuild = botifyQueryBuilder.build(true).toUriString();

    String botifyResult = null;

    try {
        System.out.println("Calling Botify API: " + queryStringBuild);
        ResponseEntity<String> response = botifyTemplate.exchange(queryStringBuild, HttpMethod.GET, entity, String.class);
        if(response.hasBody()) {
            botifyResult = response.getBody();
        }
    } catch(RestClientException ex) {
        ex.printStackTrace();
    }
    try {

    } catch (Exception e) {
        // TODO: handle exception
    }

    return botifyResult;    
}
“true”参数表示数据是否已编码。我试图禁用它,但结果是一样的

我已经删除了实际的请求生成过程(以及我的用户和项目名称)以简化事情,但这应该会从Botify返回一个响应,其中包含该URL的现有数据

相反,它返回一个400错误请求错误(这是有意义的,因为URL不正确)


我觉得这可能是RestTemplate的.exchange方法中的一个bug,但可能我没有正确地使用它。有什么建议吗?

不要像这里那样过早编码:

String request = this.baseUri + "/analyses/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com";
在RestTemplate中使用参数占位符功能,而不是文本连接

参考:

谢谢你的回答。我实际上并没有这样构造请求,我简化了函数。但是,我认为我不能使用参数占位符,因为我需要传递给端点的URL不是参数:它是请求URI的一部分。为了澄清,这个GET请求是由邮递员发出的(使用我的真实用户名、项目名称和分析slug以及相应的身份验证头):作为URI路径一部分的参数是有效的,即所谓的“路径参数”。RestTemplate能够处理它们并应用适当的编码来生成有效的URL。