我正在用 Java 编写一个简单的 REST 客户端,用于向服务器发送请求并检索一些数据。服务器使用 token 进行授权,该 token 必须包含在 header 中(根据文档)。
问题是我不知道如何正确地重写它。我有一个运行良好的 curl
命令:
curl --include --header "authorization:a7b857f6.....rest of my token" --header "Content-Type: application/json" https://serverUrl/v1/search?q=someQuery
此请求返回正确的答案(在本例中给定查询的一些结果)。
我尝试用 Java 重写它,但我收到“404 - 资源未找到,尽管”查询是相同的。
public void getResultsByQuery() {
Client client = ClientBuilder.newClient();
Response response = client
.target("https://serverUrl")
.path("/v1/search?q=someQuery")
.request("application/json")
.header("Content-Type", "application/json")
.header("authorization", "a7b857f6-........rest of my token")
.get();
System.out.println("status: " + response.getStatus());
System.out.println("headers: " + response.getHeaders());
System.out.println("body:" + response.readEntity(String.class));
}
如果我错过了什么,你能给我一个提示吗?这可能是一些愚蠢的错误,但我花了几个小时试图让它工作,但我一无所知。
最佳答案
问题在于您将查询参数作为路径的一部分包含在内,并且它们可能在传递到服务器之前进行了 URL 编码。相反,显式设置查询参数(这也使得使用变量更容易):
Response response = client
.target("https://serverUrl")
.path("/v1/search")
.queryParam("q", "someQuery")
.request("application/json")
.header("Content-Type", "application/json")
.header("authorization", "a7b857f6-........rest of my token")
.get();
请注意,打开服务器调试以打印所请求的实际 URL 以及如何解释它们通常很有帮助。这表明服务器看到的 URL 有问题。
关于Java REST客户端——将curl代码重写为Java代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212743/