Rxjava+Retrofit2+Okhttp3

本文详细介绍了Retrofit网络请求库的使用方法,包括不同类型的参数注解如@Path、@Query、@QueryMap、@Field、@Body等的应用场景,并提供了DIGEST认证的具体实现。
@Path:所有在网址中的参数(URL的问号前面),如:

http://102.10.10.132/api/Accounts/{accountId}


@Query:GET访问时,URL问号后面的参数,如:

http://102.10.10.132/api/Comments?access_token={access_token}


@QueryMap:相当于多个@Query

@GET("index.php/app/device/init")
Observable<InitBean> getAuthCode(@QueryMap Map<String, Object> param);


@Field:用于POST请求,提交单个数据 ,使用@Field时记得添加@FormUrlEncoded

@FormUrlEncoded
@POST("index.php/app/pay/index")
Observable<WechatPay> payWechat(@Field("money") String money,
                                @Field("guid") String guid,
                                @Field("store_id") String store_id,
                                @Field("shop_id") String shop_id,
                                @Field("auth_code") String auth_code);


@Body:相当于多个@Field,以对象的形式提交


同时访问网络时需要DIGEST认证,认证方式如下:

import org.apache.http.auth.AuthenticationException;
import org.apache.http.auth.MalformedChallengeException;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicHttpRequest;

import java.io.IOException;

import okhttp3.Authenticator;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;


public class DigestAuthenticator implements Authenticator {

    DigestScheme mDigestScheme = new DigestScheme();
    org.apache.http.auth.Credentials mCredentials = null;

    public DigestAuthenticator(String username,String password) {
        mCredentials = new org.apache.http.auth.UsernamePasswordCredentials(username, password);
    }

    @Override
    public Request authenticate(Route route, Response response) throws IOException {
        try {
            mDigestScheme.processChallenge(new BasicHeader("WWW-Authenticate", response.header("WWW-Authenticate")));
        } catch (MalformedChallengeException e) {
        }

        org.apache.http.HttpRequest request = new BasicHttpRequest(
                response.request().method(),
                response.request().url().toString()
        );
        String authHeader;
        try {
            authHeader = mDigestScheme.authenticate(mCredentials, request).getValue();
        } catch (AuthenticationException e) {
            authHeader = null;
        }
        if (authHeader == null) {
            return null;
        }
        return response.request().newBuilder().addHeader("Authorization", authHeader).build();
    }
}

mOkHttpClient = new OkHttpClient.Builder()
                            .cache(cache)
                            .addInterceptor(mRewriteCacheControlInterceptor)
                            .addNetworkInterceptor(mRewriteCacheControlInterceptor)
                            .addInterceptor(interceptor)
                            .retryOnConnectionFailure(true)
                            .connectTimeout(15, TimeUnit.SECONDS)
                            .authenticator(new DigestAuthenticator(username,password))
                            .build();

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Base_URL)
                .client(mOkHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

就可以添加认证。




### 结合MVP架构与RxJavaRetrofit2OkHttp3进行Android或Java项目开发 在现代Android应用开发中,采用清晰的架构模式对于项目的可维护性和扩展性至关重要。MVP(Model-View-Presenter)是一种常见的设计模式,它通过分离关注点来提高代码的模块化程度。当结合使用RxJavaRetrofit2OkHttp3时,可以进一步增强异步操作的能力以及网络请求的灵活性。 #### MVP 架构概述 MVP 是一种将 UI 层逻辑从业务逻辑中解耦的设计模式。其核心组件包括 Model、View 和 Presenter: - **Model**: 负责数据管理和处理。 - **View**: 显示界面并与用户交互。 - **Presenter**: 作为中间层,在 View 和 Model 之间传递数据并执行必要的逻辑[^1]。 #### 使用 RxJava 处理异步任务 RxJava 提供了一种强大的响应式编程模型,用于简化复杂的异步流程管理。它可以轻松实现线程切换、错误处理和事件流组合等功能。以下是 RxJava 的一些主要特性及其用途: - `Observable` 和 `Observer`: 定义数据源和订阅者之间的关系。 - `Schedulers`: 控制线程调度,例如 IO 操作在线程池中运行而主线程保持空闲状态。 - 错误传播机制: 自动捕获异常并通过回调通知下游观察者。 ```java // 创建 Observable 并指定 Scheduler Observable<String> observable = Observable.create(emitter -> { emitter.onNext("Data from network"); emitter.onComplete(); }).subscribeOn(Schedulers.io()) // 在后台线程上执行 .observeOn(AndroidSchedulers.mainThread()); // 切换到主线程更新UI ``` #### 集成 Retrofit2 进行 RESTful API 请求 Retrofit 是一个流行的 HTTP 客户端库,专为 Android 应用程序设计。它支持声明式的接口定义方式,并能自动解析 JSON 响应体至 Java 对象。为了充分利用 Retrofit 功能,通常会将其与 OkHttp 和 Gson 组件一起配置: ```java public interface ApiService { @GET("users/{id}") Call<UserResponse> getUser(@Path("id") int userId); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .client(new OkHttpClient()) // 可选地自定义客户端实例 .build(); ApiService apiService = retrofit.create(ApiService.class); Call<UserResponse> call = apiService.getUser(12345); call.enqueue(...); // 异步调用方法 ``` #### 将 OkHttp3 设置为基础网络通信工具 虽然 Retrofit 已经内置了对 OkHttp 的依赖,但在某些情况下可能还需要直接利用 OkHttp 来完成更底层的操作,比如拦截器设置或者文件上传下载功能。下面展示了一个简单的例子说明如何添加日志记录拦截器: ```java import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS).build(); ``` 最后一步就是把上述所有技术结合起来构建完整的解决方案——即让 Presenter 中发起基于 RxJava 缠绕过的 Retrofit 数据获取过程;同时确保任何耗时工作都不会阻塞主循环从而影响用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值