我有一个场景,我必须调用具有相同基本URL的API,例如www.myAPI. com
,但具有不同的base Url
。
我有一个Retrofit 2的实例,它是通过Builder
构建的:
return new Retrofit.Builder()
.baseUrl(FlavourConstants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient)
.build();
风味常量。BASE_URL
如下所示:
public static final String BASE_URL = "http://myApi.development:5000/api/v1/";
对于某些WebRequest
,我必须调用相同的API,但在其他情况下,我必须从完全不同的BaseUrl
调用它。如何更改Retrofit
实例以因此在运行时指向不同的URL?
改装实例没有。setBaseUrl或setter或任何类似于通过构建器构建的内容。
有什么想法吗?
Kotlin在定义基本url时也存在这样的漏洞
例如
@FormUrlEncoded @Headers("Accept: application/json") @POST suspend fun login( baseUrl: String, @Field("login") login: String, @Field("password") password: String @Url url: String = "$baseUrl/auth" ): ResponseAuth
它不起作用。扔:
java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
唯一的办法是杰克·沃顿建议的https://github.com/square/retrofit/issues/2161#issuecomment-274204152
Retrofit.Builder() .baseUrl("https://localhost/") .create(ServerApi::class.java)
class DomainInterceptor : Interceptor { @Throws(Exception::class) override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() return chain.proceed( request.newBuilder() .url( request.url.toString() .replace("localhost", "yourdomain.com:443") .toHttpUrlOrNull() ?: request.url ) // OR //.url(HttpUrl.parse(request.url().toString().replace("localhost", "yourdomain.com:443")) ?: request.url()) .build() ) } }
改造2.4,2019年5月
解决此问题的两个简单解决方案是:
>
对新URL进行硬编码,同时保持基本URL不变:
@GET("http://example.com/api/")
Call<JSONObject> callMethodName();
将新URL作为参数传递,同时保持基本URL不变:
@GET
Call<JSONObject> callMethodName(@Url String url);
N、 这些方法适用于GET或POST。然而,只有当您只需要使用一个或两个不同于基本URL的URL的例外时,此解决方案才有效。否则,就代码整洁而言,事情可能会变得有点混乱。
如果您的项目需要完全动态生成的基本URL,那么您可以开始阅读此内容。
幸运的是,您的改装有一个简单的解决方案:
public interface UserManager {
@GET
public Call<ResponseBody> userName(@Url String url);
}
url
字符串应指定您希望使用的完整Url。
目前,我在改装方面面临一些问题。对于第二个请求,我提供给ReformInstance的URL正在更改。以下是代码: 以下是针对不同API请求的接口方法: UrlEndPoints.kt 对于第一个请求(loginUserByFacebook),我通过调试响应获得的URL是: http://test.sample.com/req/v1/user/auth/facebook 这很好,工作也很好。但是对
重头戏来了,打开conf/ioc/dao.js, 修改dao的定义 dao : { type : "org.nutz.dao.impl.NutDao", args : [{refer:"dataSource"}], fields : { interceptors : [{ref
打开WebContent/WEB-INF/jsp/user/profile.jsp, 在这段代码后面 邮箱验证状态:<c:out value="${obj.emailChecked}"></c:out><p /> 加入 <c:if test="${!obj.emailChecked}"> <script type="text
我在响应上编码数据。把键放在标题上。现在,当我得到字符串数据时,我可以在观察者上解码。但我想在GsonConverterFactory上做这件事,然后我可以在GSONconverter Factory上解码,并在响应时使用gson数据。我想知道如何在GSonConverter FactoryResponseByConverter中获取标头?
问题内容: 我正在实现登录功能,并为此使用Post请求,但是我收到错误提示 “ retrofit.RetrofitError:com.squareup.okhttp.internal.http.HttpMethod.METHODS” 下面是我的代码 在它下面的logcat输出。 02-10 13:02:43.846:W / System.err(30684):retrofit.RetrofitEr
我的问题是我无法使用获得无限流。在我获得初始轮询()请求的凭据后-我执行初始轮询()请求。如果没有变化,每个轮询()请求会在25秒内响应,如果有任何变化,则会更早响应-返回changed_data[]。每个响应都包含下一个轮询请求所需的数据-我应该在每次轮询()响应后执行新轮询()请求。这是我的代码: 我是RxJava新手,也许我不懂一些东西,但我无法获得无限流。我接到3个电话,然后是onNext