java.lang.IllegalArgumentException:在使用 GET 方法的 Retrofit 2.1.0 时,baseUrl 必须以 / 结尾

问题描述 投票:0回答:8

我正在使用Retrofit2进行API解析。

使用

retrofit1.9.0
时,post 和 get 方法都可以正常工作。但是使用
retrofit 2.1.0
,在get方法中,出现错误:

java.lang.IllegalArgumentException:baseUrl 必须以 / 结尾

我检查了我的代码,没有问题,它适用于 post 方法。

    Retrofit retrofit= new Retrofit.Builder() 
                        .baseUrl("sample.com/ecomtest/index.php?route=api/") 
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
java android
8个回答
41
投票

'?'不能在baseUrl中,您应该将其移至API接口。像这样。

完整网址:

https://free-api.heweather.com/v5/now?
city=yourcity&key=yourkey

所以,

baseUrl = "https://free-api.heweather.com/v5/"

以及API接口

@GET("now?")
Observable<HeWeather5> getNowWeather(@Query("city") String city,@Query("key") String key);

16
投票

您作为

API_BASE_URL
传递的 URL 应以“/”结尾,因此请将其添加到 URL 末尾。

Retrofit.Builder builder =
         new Retrofit.Builder()
                     .baseUrl(API_BASE_URL)
                     .addConverterFactory(GsonConverterFactory.create());

哪里

String API_BASE_URL = "http://www.domain.com/"; //string end with "/"

它会起作用的。


6
投票

在改造中,您不能使用“某些?”之类的端点在基本 URL 中。 像

一样分割您的 URL
String url="http://sample.com/ecomtest/index.php?route=api/";
String baseUrl=url.split(".com/")[0]+".com/";
String queryUrl=url.split(".com")[1];

然后使用

Retrofit.Builder builder =
         new Retrofit.Builder()
                     .baseUrl(baseUrl)
                     .addConverterFactory(GsonConverterFactory.create());

并将端点作为请求方法的路径传递给您,例如

@GET("{endpoint}")
    Call<Response> getData(@Path("endpoint") String endpoint);

完成了


5
投票

假设您的网址是“https://yourapi.com/abc?def&key=123

将您的网址分成两部分。

String baseURL ="https://yourapi.com/"; //make sure you have '/' at the end

String key = "123";

然后在 GET 注释中添加剩余部分,如下所示

@GET("abc?def&key="+key)


4
投票

有同样的情况,这里的答案几乎涵盖/解释了解决方案。 但不完全是这样。

我尝试像这样存储

BASE_URL
sample.com/api
我的端点是例如:
/users

添加

/
的解决方案没有帮助:
sample.com/api/

问题在于

/
中有多个
BASE_URL
,我猜改造会因为斜杠不仅仅作为结束标记而变得疯狂。

唯一有效的解决方案:

sample.com/
其终点将是:
api/users
因此,在 BASE_URL 中仅保留一个
/
是我的解决方案,并将其保留在基本 url 字符串的末尾


0
投票

一定要像这样设置 [encoded = false] :

suspend fun getAnyThing(@Query("api_key", encoded = false) apikey: String)

0
投票

就我而言,输入“/”不起作用。因为我的 baseUrl 末尾已经有“/”。我的改造版本是2.11.0,我将此版本更改为2.9.0,所以我的问题解决了。


-4
投票

我使用

URL = "URL/"
解决了这个错误。必须有 / 作为最后一个字符才能使其工作。

© www.soinside.com 2019 - 2024. All rights reserved.