0

我正在用 Java 编写一个简单的 REST 客户端,它将请求发送到服务器并检索一些数据。服务器使用令牌进行授权,该令牌必须包含在标头中(根据文档)。

问题是我不确定如何正确地重写它。我有一个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));
}

如果我错过了什么,你能给我一个提示吗?这可能是一个愚蠢的错误,但我花了几个小时试图让它工作,我一无所知。

4

1 回答 1

2

问题是您将查询参数作为路径的一部分包含在内,并且它们可能在传递到服务器之前进行了 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 有问题。

于 2014-11-30T11:48:32.960 回答