【问题标题】:Retrofit BaseUrl And API改造 BaseUrl 和 API
【发布时间】:2021-09-27 04:18:23
【问题描述】:

我正在学习如何使用改造库,但是我遇到了一个小问题。

所以我设置了所有内容并运行我的项目,但首先我出现了这个错误:

Caused by: java.lang.IllegalArgumentException: baseUrl must end in /:

所以我添加了“/”,但后来我意识到它不止于此,我应该只保留 baseUrl 并将 api 添加到我创建的接口中。

我尝试以不同的方式添加 api,但没有成功。

这里有一些代码:

改造 BaseUrl:

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.nytimes.com/svc/movies/v2/critics/full-time.json?api-key=abcdefghijklmnop")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

一开始我是像上面这样使用的,但经过一番研究我发现我必须离开baseUrl并通过接口传递另一半地址。

界面-

public interface ConnectAPI {

    @GET("results")
    Call<List<Reviewers>> getReviewers();

}

我会很高兴得到一些帮助, 谢谢!

【问题讨论】:

    标签: java android api android-studio retrofit2


    【解决方案1】:
    //ApiClient class for BaseUrl(Retrofit)
    public class ApiClient {
    
        private static String BASE_URL="";
    
        private static OkHttpClient getOkHttpClient(){
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
            httpClient.addInterceptor(logging).addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request original = chain.request();
                    HttpUrl originalHttpUrl = original.url();
                    HttpUrl url = originalHttpUrl.newBuilder().build();
                    Request.Builder requestBuilder = chain.request().newBuilder()
                            .addHeader("Content-Type","application/json")
                            .addHeader("timezone", TimeZone.getDefault().getID())
                            .url(url);
    
                    Request request = requestBuilder.build();
                    Response response = chain.proceed(request);
                    return response;
                }
            });
    
            return httpClient.connectTimeout(20, TimeUnit.SECONDS)
                    .readTimeout(10, TimeUnit.SECONDS)
                    .writeTimeout(10, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .build();
        }
    
    
        private static Retrofit.Builder retrofitBuilder=new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(getOkHttpClient())
                .addConverterFactory(GsonConverterFactory.create());
    
    
        private static Retrofit retrofit=retrofitBuilder.build();
    
        private static ApiService apiService=retrofit.create(ApiService.class);
    
    
    
        public static ApiService getApiService(){
    
            return apiService;
    
        }
    }
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    正如 Gabe Sechan 所说,在使用 Retrofit 时,您需要设置一个对所有 api 调用都相同的基本 url,然后在每个端点的基础上附加 url 的其余部分。如果您将代码更改为以下内容,您应该会很好

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.nytimes.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    

    getReviewers()

    public interface ConnectAPI {
    
        @GET("svc/movies/v2/critics/full-time.json?api-key=abcdefghijklmnop")
        Call<List<Reviewers>> getReviewers();
    
    }
    

    【讨论】:

    • 谢谢,但是我之前尝试过,但我收到此错误:“E/Failure:: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $”
    • 这与您提出的问题无关,与响应以及您如何解析有关
    【解决方案3】:

    基本 URL 应该是您要在该界面上进行的所有查询的根。其余的应该是实际 API 接口上 URL 的一部分。因此,对于您的示例,基本 URL 可能应该是“https://api.nytimes.com/svc/movies/v2/”。尽管其中的任何子集(例如“https://api.nytimes.com/”)也可以工作,只要该接口具有所有其余路径。基本上,当发出实际的 HTTP 请求时,查询的 URL 会连接到基本 url 的末尾。

    【讨论】:

    • 感谢您的回复,但是界面中剩下的路径怎么使用呢?
    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多