在使用Retrofit时,如果我们想变更某个请求的URL,GET请求的话,可以使用@Url 注解,但如果是POST请求,是不能直接这么干的。
我的做法是在Retrofit.create(XXXX.class)之前,给OkHttp添加拦截器,拦截器识别请求header中是否带着我们预先自定义的参数。在请求发起时header中增加key:NEW_HOST_URL,value为将于替换的新地址。
拦截器的代码如下:
/** * interceptor to intercept POST request to change request address. * * GET request: suggest to use {@link Url} on method. */ public class PostUrlInterceptor implements Interceptor { public static final String NEW_HOST_URL = "NEW_HOST_URL"; @Override public Response intercept(@NonNull Chain chain) throws IOException { Request request = chain.request(); String newHost = request.header(NEW_HOST_URL); if (!TextUtils.isEmpty(newHost)) { Request.Builder builder = request.newBuilder(); HttpUrl httpUrl = request.url(); String originAddress = httpUrl.scheme() + "://" + httpUrl.host() + ":" + httpUrl.port(); String requestUrl = httpUrl.url().toString(); if (requestUrl.startsWith(originAddress)) { builder.url(requestUrl.replace(originAddress, newHost)); } request = builder.build(); } return chain.proceed(request); } }
如果header中有这个新的地址,就用它去请求。如果没有则不做拦截。
就这么简单。
为啥 POST 请求不能直接使用 @Url 注解参数?
运行时修改,这个URL指不定是哪个
request.header()这个始终是空的是怎么回事?
请求时带上header,例如:> sendHeartBeat(@Body FpnnSecureRequest request, @HeaderMap Map headers);
这两种方式:
@Headers({“CONNECT_TIMEOUT:5000”, “READ_TIMEOUT:5000”, “WRITE_TIMEOUT:5000”})
@POST(“service/ping”)
Observable
提示错误 @Header({“connect_Timeout:5000”, “write_Timeout:5000”, “read_Timeout:5000”}) 如何改
另外 。。。。。在每个请求需要加这个嘛
不用都加啊,我做这个功能只是有些特定的业务接口需要搞一些奇怪的事情。
提示什么样的错误可以贴一下