用到的依賴庫
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
一個(gè)完整的網(wǎng)絡(luò)請(qǐng)求
public interface ApiURL {
@GET("geocoding")
Observable<ApiBean> getApiBean(@Query("a") String city); //@Query是向后追加的效果 等同于 geocoding?a=city
}
private void getDataByRx() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//添加攔截器填硕,自動(dòng)追加參數(shù)
builder.addInterceptor(new AppendUrlParamIntercepter());
builder.addInterceptor(new AppendHeaderParamIntercepter());
//添加攔截器籽腕,打印網(wǎng)絡(luò)請(qǐng)求
if (NetworkConfig.DEBUG) {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(httpLoggingInterceptor);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://gc.ditu.aliyun.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(builder.build())
.build();
ApiURL apiURL = retrofit.create(ApiURL.class);
Observable<ApiBean> api = apiURL.getApiBean("北京市");
api.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ApiBean>() {
@Override
public void accept(ApiBean apiBean) throws Exception {
}
});
}
統(tǒng)一追加Url
/**
* Get請(qǐng)求自動(dòng)追加參數(shù)
* Created by zkt on 2018-2-3.
*/
public class AppendUrlParamIntercepter implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//偷天換日
Request oldRequest = chain.request();
//拿到擁有以前的request里的url的那些信息的builder
HttpUrl.Builder builder = oldRequest
.url()
.newBuilder();
//得到新的url(已經(jīng)追加好了參數(shù))
HttpUrl newUrl = builder.addQueryParameter("deviceId", "12345")
.addQueryParameter("token", "i_am_token")
.addQueryParameter("appVersion", "1.0.0-beta")
.build();
//利用新的Url记焊,構(gòu)建新的request,并發(fā)送給服務(wù)器
Request newRequest = oldRequest
.newBuilder()
.url(newUrl)
.build();
return chain.proceed(newRequest);
}
}
統(tǒng)一追加Header
/**
* 統(tǒng)一追加Header
* Created by zkt on 2018-2-3.
*/
public class AppendHeaderParamIntercepter implements Interceptor {
// 1.獲取以前的Builder
// 2.為以前的Builder添加參數(shù)
// 3.生成新的Builder
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Headers.Builder builder = request
.headers()
.newBuilder();
//統(tǒng)一追加Header參數(shù)
Headers newBuilder = builder.add("header1", "i am header 1")
.add("token", "i am token")
.build();
Request newRequest = request.newBuilder()
.headers(newBuilder)
.build();
return chain.proceed(newRequest);
}
}
統(tǒng)一追加Body
/**
* 將所有的Get -> POST, 將Get后面的Query Params -> Body (基本用不到)
* Created by zkt on 2018-2-3.
*/
public class AppendBodyParamIntercepter implements Interceptor {
// 1.獲取以前的Builder
// 2.為以前的Builder添加參數(shù)
// 3.生成新的Builder
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//拿到所有Query的Key
Set<String> queryKeyName = request
.url()
.queryParameterNames();
//將query -> body
StringBuilder bodyString = new StringBuilder();
for (String s : queryKeyName) {
bodyString.append(s)
.append("=")
//查詢url后面key的value
.append(request.url().queryParameterValues(s))
.append(",");
}
//構(gòu)建新body。 MediaType根據(jù)實(shí)際情況更換
RequestBody newBody = RequestBody.create(MediaType.parse("application/json"),
bodyString.toString().substring(0, bodyString.toString().length() - 1));
Request newRequest = request.newBuilder()
.post(newBody)
.build();
return chain.proceed(newRequest);
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者