1

我正在尝试使用 Retrofit 实现 TheMovieDB API,但无法将 api 密钥附加到查询的开头。感觉 TheMovieDB 在这里有过错,因为在查询开始时以非传统方式请求 api 密钥。

当试图拦截请求并添加查询参数时,像这样,它被附加到请求的末尾,这不是我想要的。

    private class WebApiAuthenticator implements RequestInterceptor {
    @Override
    public void intercept(RequestFacade request) {
        if (apiKey != null) {
            request.addEncodedQueryParam(PARAM_API_KEY, apiKey);
        }
    }
}

以及服务实现:

    @GET("/search/multi&query={query}")
    void getSearchResults(@Path("query") String query, Callback<String> callback);

这会产生以下结果:

---> HTTP GET https://api.themoviedb.org/3/search/multi&query=mysearchquery?api_key=thisismyapikey

我想要这个结果:

---> HTTP GET https://api.themoviedb.org/3/search/multi?api_key=thisismyapikey&query=mysearchquery

我该如何将我的查询参数添加到请求的开头?

4

1 回答 1

1

我找到了解决方案。我没有从那里拦截和添加查询参数,而是创建了一个查询映射,并始终将我的 api 密钥与我的搜索查询一起传递给查询映射中的服务,如下所示:

Map<String, String> data = new HashMap<>();
data.put("api_key", apiKey);
data.put("query", "avengers");
movieService.getSearchResults(data, new Callback<String>()
{
    @Override public void success(final String s, final Response response) {
    System.out.println(s);
    }

    @Override public void failure(final RetrofitError error) {
        LOGGER.log(Level.WARNING, error.getResponse().getReason());
    }
});

这是服务实现:

@GET("/search/multi")
void getSearchResults(@QueryMap Map<String, String> queries, Callback<String> callback);

这会产生结果:

---> HTTP GET https://api.themoviedb.org/3/search/multi?api_key=myapikey&query=avengers
于 2017-03-03T17:40:12.840 回答