• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Pastry: 类Retrofit库,更精简更方便

原作者: [db:作者] 来自: 网络 收藏 邀请

Pastry

Retrofit风格的网络库,支持:

  1. POST
  2. GET
  3. Param("key")//单个key-value
  4. Path("urlpattern")String value //@GET("xxx/{id}/{name}") @Path("id")String id
  5. JsonParam JavaBean/Map 拆分为key-value参数
  6. JsonField JavaBean/Map 提交 application/json数据
  7. FileField File/File[]
  8. @Header("key")String value 方法参数级别
  9. @Headers({"xx:xx",""}) 方法级别

集成方法

    //设置初始化配置,根路径                PastryConfig.init(this)                .setHost("http://api.com")                .applyConfig();
//Api接口,public interface Api {/***返回JavaBean*/    @POST("App/User/User/get_u_member")    public ResultBean<MemberInfo> getMemberInfo(@Param("member_id") String memberId);/***返回okhttp3.Call*/    @POST("App/User/Register/get_register_code")    public Call getRegisterCode(@Param("mobile") String mobile);/***返回原json串*/    @GET("App/User/User/get_homepage")    public String getHomePage(@Param("member_id") String memberId, @Param("type") int type, @Param("p") int p);}
public class MainActivity extends AppCompatActivity {    private Pastry mPastry;    private Api api;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mPastry = Pastry.newInstance(this);        api = mPastry.create(Api.class);        final TextView txt = (TextView) findViewById(R.id.txtInfo);        findViewById(R.id.btnGetMemberInfo).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                api.getMemberInfo("123");            }        });        findViewById(R.id.btnRegisterCode).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Call call = api.getRegisterCode("18086021234");                call.enqueue(new Callback() {                    @Override                    public void onFailure(Call call, IOException e) {                    }                    @Override                    public void onResponse(Call call, Response response) throws IOException {                        //okhttp流程                    }                });            }        });        findViewById(R.id.btnGetHomePage).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                api.getHomePage("234", 1, 1);            }        });    }    public void getHomePage(String homePage) {        //api.getHomePage("234", 1, 1)异步请求的数据会直接被Pastry回调过来        //这边的参数,就是api.getHomePage("234", 1, 1)的返回值        //由于异步,直接调用api.getHomePage("234", 1, 1),并拿到的返回值永远是null        //这个方法是UIThread , 应当用于处理UI显示    }    public void getMemberInfo(ResultBean<MemberInfo> infoResultBean) {//        api.getMemberInfo("123"); 相应的回调方法,返回值为实体,则会直接转为相应的实体并回调给接类的同一名称方法        TextView txt = (TextView) findViewById(R.id.txtInfo);        txt.setText(String.format("%s %s %s", infoResultBean.getData().getId(), infoResultBean.getData().getNickname(), infoResultBean.getData().getHead_img()));    }}
allprojects {		repositories {			maven { url 'https://jitpack.io' }		}	}
compile 'com.github.blesslp.Pastry:plugins:v1.2.5'    //自定义的一些插件,日志打印,Rxjava适配等compile 'com.github.blesslp.Pastry:pastry:v1.2.5'     //网络库

com.github.blesslp.Pastry:plugins 介绍

LoggerInterceptor

你可以这个开启,用以获得一个日志打印功能

PastryConfig.init(this).setHost("http://api.com/").addInterceptor(new LoggerInterceptor(LoggerInterceptor.LOG_TYPE.LOG_FULL)).applyConfig();

LoggerInterceptor.LOG_FULL / LoggerInterceptor.LOG_NONE

D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════D/PRETTYLOGGER: ║ Thread: POST : http://api.com/App/User/User/get_u_memberD/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────D/PRETTYLOGGER: ║ {D/PRETTYLOGGER: ║   "POST": "http:\/\/api.com\/App\/User\/User\/get_u_member",D/PRETTYLOGGER: ║   "member_id": "609"D/PRETTYLOGGER: ║ }D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════D/PRETTYLOGGER: ╔════════════════════════════════════════════════════════════════════════════════════════D/PRETTYLOGGER: ║ Thread: POST : http://api.com/App/User/User/get_u_memberD/PRETTYLOGGER: ╟────────────────────────────────────────────────────────────────────────────────────────D/PRETTYLOGGER: ║ {D/PRETTYLOGGER: ║   "status": "1",D/PRETTYLOGGER: ║   "msg": "获取成功!",D/PRETTYLOGGER: ║   "data": {D/PRETTYLOGGER: ║     "id": "609",D/PRETTYLOGGER: ║     "nickname": "blesslp",D/PRETTYLOGGER: ║     "type": "1"D/PRETTYLOGGER: ║   }D/PRETTYLOGGER: ║ }D/PRETTYLOGGER: ╚════════════════════════════════════════════════════════════════════════════════════════

ObservableHandler

如果想要结合RxJava ,你可以这样

PastryConfig.init(this)                .setHost("http://api.com/")                .addInterceptor(new LoggerInterceptor(LoggerInterceptor.LOG_TYPE.LOG_FULL))                .addReturnValHandler(new ObservableHandler())                .applyConfig();                public interface Api {    @POST("App/User/User/get_u_member")    public Observable<ResultBean<MemberInfo>> getMemberInfo(@Param("member_id") String memberId);}findViewById(R.id.btnGetMemberInfo).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                api.getMemberInfo("609").subscribe(new Consumer<ResultBean<MemberInfo>>() {                    @Override                    public void accept(@NonNull ResultBean<MemberInfo> infoResultBean) throws Exception {                        String nickname = infoResultBean.getData().getNickname();                                            }                }, new Consumer<Throwable>() {                    @Override                    public void accept(@NonNull Throwable throwable) throws Exception {                                            }                });            }        });

PastryDelegate和@InjectApi

你可以这样将Pastry集成到你的项目的任何基类中

 * Example: * public class BaseActivity { *     private PastryDelegate mPastryDelegate; * *     public void onCreate(Bundle savedInstance) { *         super.onCreate(savedInstance); *         mPastryDelegate = PastryDelegate.create(this); *         mPastryDelegate.autoInject(); *     } *      *     //在某个情况下取消网络请求 *     public void onStop() { *         mPastryDelegate.cancelAll(); *     } * } *  * Example2: * public class LoginActivity extends BaseActivity { *     @InjectApi *     private LoginModel mLoginModel; *      *     protected void onCreate(Bundle savedInstance) { *         super.onCreate(savedInstance); *         setContentView(R.layout.login_activity); *         findViewById(R.id.btnSubmit).setOnClickListener(view->mLoginModel.login(userName,password)); *     } *      *     //登录成功的操作 *     public void login(...) { *         ... *     } *      *      * } *

BaseInterceptor

更简单的添加拦截器

public class XxxInterceptor extends BaseInterceptor {    @Override    public Request onBefore(Request request) {        /**         * 统一添加header         */        return request.newBuilder()                .addHeader("headerKey", "headerValue")                .addHeader("headerKey2","headerValue2")                .build();    }or...    @Override    public Request onBefore(Request request) {        if (!NetworkUtils.hasConnection(TheApplication.getInstance())) {            //无网提示            ...        }        return super.onBefore(request);    }}

GlobalParamProvider

如果你要给某些类请求统一注入参数,那么这个将很有用

private GlobalParamProvider nullProvider = new GlobalParamProvider() {        @Override        public Map<String, String> provider() {            HashMap<String, String> params = new HashMap<>();            params.put("member_id", "123456");            params.put("token", "wwqofjdsklnxvoewiurewojfdslkfjdsfdo12lkdsjfsd");            return params;        }    };      private GlobalParamProvider keyProvider = new GlobalParamProvider() {        @Override        public Map<String, String> provider() {            HashMap<String, String> params = new HashMap<>();            params.put("someParams", "1111");            return params;        }    };    
PastryConfig.init(this)                ...                .setGlobalParamProvider(nullProvider)                .addGlobalParamProvider("hello",keyProvider)                .applyConfig();

怎么使用呢,

@GlobalParampublic interface Api {...}or@GlobalParam("hello")public interface Api {...}

如此一来,Api里面的所有请求,都会被附加对应的参数,

@GlobalParam        使用了     setGlobalParamProvider(xx)  提供的map@GlobalParam(key)   使用了     addGlobalParamProvider(key,xx)  提供的map你可以定义多个,也可以给一个(api类或者方法)指定多个全局参数提供器

或者也可以

@GlobalParampublic interface Api {    @GlobalParam("hello")    @POST("App/User/User/get_u_member")    public ResultBean<MemberInfo> getMemberInfo();}

如此一来

api.getMemberInfo() 方法将会被附加上nullProvider和keyProvider提供的所有参数

这种方法在有些时候很方便,但是我更建议和后台统一把全局参数加到header中.

还有哪些东西?

ReturnHandler

它的子类:

Pastry自带的:    CallHandler    BeanHandlerplugins内的:    FlowableHandler    ObservableHandler
如果你继承它(ReturnHandler),PastryConfig.addReturnValHandler(加入你的处理器类)就可以轻松拓展Pastry

One More Things?

即将开放自定义注解和注解处理器来轻松扩展Pastry

@POST , @GET , @Param("key")..
2017/8/14 修复 参数缓存导致null的情况下,用了旧的参数
2017/9/21 修复方法级注解的参数被缓存的情况
2018/1/17 修复@JsonParam内部有List的情况下的参数拆分错误

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap