gpt4 book ai didi

java - 在 REST API 请求中包含 URL 地址时 RestTemplate 出现问题

转载 作者:行者123 更新时间:2023-11-30 05:35:56 25 4
gpt4 key购买 nike

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

当我需要调用端点的方法时,我的问题就出现了,该方法将 URL 作为请求的 URI(而不是参数)的一部分。此端点的文档位于 https://developers.botify.com/api/reference/#!/Analysis/getUrlDetail

请求的结构基本上是这样的:

/analysis/{用户名}/{project_slug}/{analysis_slug}/urls/{url}

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

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

/analysis/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com

...最终结果如下:

/analysis/myusername/myprojectname/myprojectslug/urls/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;
}

在这一行中:

    botifyQueryBuilder.build(true).toUriString();

“true”参数指示数据是否已经编码。我尝试禁用它,但结果是一样的。

我已经删除了实际的请求生成过程(以及我的用户和项目的名称)以简化操作,但这应该会从 Botify 返回带有该 URL 的现有数据的响应。

相反,它会返回 400 bad request 错误(这是有道理的,因为 URL 不正确)。

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

最佳答案

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

String request = this.baseUri + "/analyses/myusername/myprojectname/myprojectslug/urls/https%3A%2F%2Fwww.example.com";

使用 RestTemplate 中的参数占位符功能代替文本连接。

引用: Spring RestTemplate GET with parameters

关于java - 在 REST API 请求中包含 URL 地址时 RestTemplate 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56629988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com