Retrofit请求时动态切换IP

创建BaseUrlInterceptor.java文件


import android.util.Log;
import java.io.IOException;
import java.util.List;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

public class BaseUrlInterceptor implements Interceptor {

	public static String baseUrl = "https://192.168.1.1/"; 
 
    @Override
    public Response intercept(Chain chain) throws IOException {
        //获取request
        Request request = chain.request();
        //从request中获取原有的HttpUrl实例oldHttpUrl
        HttpUrl oldHttpUrl = request.url();
        //获取request的创建者builder
        Request.Builder builder = request.newBuilder();
        //从request中获取headers,通过给定的键url_name
        //如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
        builder.removeHeader("urlname");
        //匹配获得新的BaseUrl

        HttpUrl newBaseUrl = null;
        Log.e("Url", "intercept: "+oldHttpUrl.toString());
        newBaseUrl = HttpUrl.parse(baseUrl);

        //重建新的HttpUrl,修改需要修改的url部分
        HttpUrl newFullUrl = oldHttpUrl
                .newBuilder()
                .host(newBaseUrl.host())//更换主机名
                .port(newBaseUrl.port())//更换端口
                .build();
        //重建这个request,通过builder.url(newFullUrl).build();
        // 然后返回一个response至此结束修改
        Log.e("Url", "intercept: "+newFullUrl.toString());
        return chain.proceed(builder.url(newFullUrl).build());
    }
}

调用地址


 OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cache(cache)
                .addInterceptor(loggingInterceptor)
                .addInterceptor(new BaseUrlInterceptor()) //调用自己写的拦截器
                .connectTimeout(7, TimeUnit.SECONDS)
                .readTimeout(7, TimeUnit.SECONDS)
                .writeTimeout(7, TimeUnit.SECONDS)
                .build();
               
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Retrofit是一个基于OkHttp的RESTful风格的网络请求框架,它可以将一个HTTP API转换为Java接口。在Retrofit中,我们需要定义一个Java接口来描述HTTP API,然后通过Retrofit.create()方法来创建该接口的实例。下面是一个简单的示例: 假设我们有一个HTTP API,它的URL为https://example.com/api,请求方式为GET,请求参数为id和name,返回类型为JSON格式的字符串。那么我们可以定义一个Java接口来描述这个API: ```java public interface MyApi { @GET("/api") Call<String> getData(@Query("id") String id, @Query("name") String name); } ``` 在这个接口中,我们使用了@GET注解来指定请求方式和URL,使用@Query注解来指定请求参数,使用Call<String>来指定返回类型。 接下来,我们可以使用Retrofit.create()方法来创建该接口的实例: ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://example.com") .build(); MyApi myApi = retrofit.create(MyApi.class); ``` 在这个示例中,我们首先创建了一个Retrofit实例,并通过baseUrl()方法指定了API的基础URL。然后,我们调用create()方法来创建MyApi接口的实例。 最后,我们可以使用该实例来发起网络请求: ```java Call<String> call = myApi.getData("123", "test"); call.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { String data = response.body(); // 处理返回数据 } @Override public void onFailure(Call<String> call, Throwable t) { // 处理请求失败 } }); ``` 在这个示例中,我们调用了MyApi接口的getData()方法来发起网络请求,并通过enqueue()方法来异步处理请求结果。在请求成功,我们可以通过response.body()方法获取返回的数据,在请求失败,我们可以在onFailure()方法中处理请求失败的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值