我是一名热爱 Android 技术的程序员,平时爱造轮子,人送外号轮子哥 。
我的理想是让这个世界没有难开发的安卓项目,消灭一切难维护的代码。
Android 网络请求框架,简单易用,so easy
License: Apache License 2.0
如题
不是正式测试服的配置,我除了正式的域名外还需要调用其他的域名,有动态配置的方法吗
怎么单个修改某个接口的超时时间,不统一设置
使用的库版本:
api 'com.hjq:http:8.6'
api 'com.squareup.okhttp3:okhttp:4.8.0'
api 'com.google.code.gson:gson:2.8.6'
请求的对象封装:
class ApiGetAuthCode : BaseApi() {
@HttpRename("email")
private var email: ReqData? = null
class ReqData{
@HttpRename("userName")
lateinit var userName:String
}
override fun getApi(): String {
return "url" //这是一个合法的url
}
class Result{
}
companion object{
fun param(email:String):ApiGetAuthCode{
val api = ApiGetAuthCode()
val data = ReqData()
data.userName = email
api.email = data
return api
}
}
}
请求的日志:
D/EasyHttp: RequestMethod = POST
D/EasyHttp: ----------------------------------------
D/EasyHttp:
{
"Companion": {
},
"email": {
"userName": "[email protected]"
}
}
----------------------------------------
其中Companion
字段是我们并不需要的字段,有没有某种方式可以隐藏掉这种字段呢?还是说我必须得使用Java代码来进行相对应的封装?
另外,我目前为止还没有看到返回的日志,我想这个库应该是支持的吧?
期待能够尽早回应,谢谢
实际请求中,header自动设置Transfer-Encoding chunked,而不是Content-Length,这种情况,后端不兼容
具体逻辑在okhttp的类BridgeInterceptor中
解决办法:JsonObjectBody中覆写contentLength()方法返回json长度
保存、获取cookie
你说Retrofit的一些缺点,我是认同的。但是你说的维护性其实是不认同的。
一,Retrofit不支持动态参数修改是个败笔,但是一个接口一个类的时代已经过去了,真的不建议再弄回来。与其造轮子,不如写个类似Retrofit的库,开放出动态修改参数这样的功能即可。
二,下载的功能着实有些鸡肋,没有贬低的意思,网络请求就好好做网络请求就好了。
项目中会有这样的一种需求。某些字段在某些情况下会参与请求,某些情况下会参与请求。
如:
@HttpRename("param1")
String param1;
@HttpRename("param2)
String param2;
在场景A中需要仅请求 param1
参数
在场景B中需要仅请求 param2
参数
在场景C中需要两个参数同时请求。
如果按照现在的注解方案,需要写三份Java代码,针对于一个请求url。
请问有对于这种使用状况的一种改善方案吗?
如题,打算在项目中使用此框架,希望此框架可以一只维护
一个接口就要新建一个文件,不觉得很麻烦吗
能否详细说说怎么进行混淆,按照DEMO上的混淆规则打包后无法正常使用框架,但是程序没有闪退
BodyType中的FROM实际应为“ FORM”
比如获取github api,获取个人仓库列表。我这边老是解析失败,raw response是成功返回了。
https://api.github.com/users/{用户名}/repos
发起请求:
// 获取验证码
EasyHttp.get(this)
.api(new ListInfoApi()
.setUserName("用户名"))
.request(new HttpCallback<HttpListData>(this) {
@OverRide
public void onStart(Call call) {
super.onStart(call);
}
@Override
public void onSucceed(HttpListData<ReposInfo> data) {
Log.d("xxx","data:"+data.toString());
}
@Override
public void onFail(Exception e) {
super.onFail(e);
Log.d("xxx","onFail:e:"+e.getMessage());
}
});
}
jiava bean:
public final class HttpListData extends HttpData<HttpListData.ListBean> {
public static class ListBean {
/** 当前页码 */
private int pageIndex;
/** 页大小 */
private int pageSize;
/** 总数量 */
private int totalNumber;
/** 数据 */
private List<T> items;
/**
* 判断是否是最后一页
*/
public boolean isLastPage() {
return Math.ceil((float) totalNumber / pageSize) <= pageIndex;
}
public int getTotalNumber() {
return totalNumber;
}
public int getPageIndex() {
return pageIndex;
}
public int getPageSize() {
return pageSize;
}
public List<T> getItems() {
return items;
}
}
}
可以增加一个实现 WebSocket 请求连接的封装工具类吗,用于快速实现 WebSocket 请求连接。选择性导入包的。Socket太麻烦了
添加个参数指定字段名吧
如果参数叫access-token就没法用了
这个userId怎么传递呢?
不过有个问题想请教下。get请求表单格式传递List参数,后台需要的参数是 ids=1,2,3,4 格式,但是通过请求类成员List ids请求时,拼出来的格式是ids=[1,2,3],后台不兼容,有没有好的方法呀。
轮子哥是否考虑支持,类似rxjava
大佬,这个框架支持协程吗!
希望可以通过键值对的方式传递参数,请问支持吗?
谢谢
作者大佬您好! 请问一下动态参数在get链接里面,不是直接在后面添加参数,不是多域名,是动态链接 就是在链接上数据是动态传的,彩云的天气api `这个用EasyHttp如何实现 代码如下
/ /今天的天气 v2/ 后的是彩云的AppId
@GET("v2/xxxxx/GK/ {longitude}, {latitude}/realtime.json")
Observable<HomeWeatherTodayEntity> saveHomeWeatherTodayRx (@Header ("Cache-Control") String cacheControl,
(@Path("longitude") String longitude),
(@Path("latitude") String latitude );
如题
如题
如题
/**
* 判断对象是否为 Bean 类
*/
public static boolean isBeanType(Object object) {
// Number:Long、Integer、Short、Double、Float、Byte
// CharSequence:String、StringBuilder、StringBuilder
return !(object instanceof Number || object instanceof CharSequence ||
object instanceof Boolean || object instanceof File ||
object instanceof InputStream || object instanceof RequestBody ||
object instanceof Character || object instanceof JSONObject ||
object instanceof JSONArray);
}
这里如果传过来的参数是空也认为是对象,但实际上有时候是封装类型,只不过值为空而已。
所以当参数结构如下时:
public class XXApi implements IRequestApi, Serializable {
private String name;
private Map<String, Object> params;
如果往params里面添加一个值为null的属性时提交请求会报错。
异常代码:
case JSON:
if (value instanceof List) {
// 如果这是一个 List 参数
params.put(key, EasyUtils.listToJsonArray(((List<?>) value)));
} else if (value instanceof Map) {
// 如果这是一个 Map 参数
params.put(key, EasyUtils.mapToJsonObject(((Map<?, ?>) value)));
} else if (EasyUtils.isBeanType(value)) {
// 如果这是一个 Bean 参数
params.put(key, EasyUtils.mapToJsonObject(EasyUtils.beanToHashMap(value)));
} else {
// 如果这是一个普通的参数
params.put(key, value);
}
break;
default:
由于isBeanType的判断错误导致调用了beanToHashMap,而此时的value是null,所以就异常了。
如题
看上去很屌的样子,但举的例子看不懂啊
implementation 'com.hjq:http:9.2'
错误:
class com.xxx.bean.XxxBean declares multiple JSON fields named createTime
com.hjq.http.exception.HttpException: class com.xxx.bean.XxxBean declares multiple JSON fields named createTime
at com.cloudwave.lvzaimo.http.model.RequestHandler.requestFail(RequestHandler.java:197)
at com.hjq.http.callback.NormalCallback.onFailure(NormalCallback.java:61)
at com.hjq.http.callback.BaseCallback.onResponse(BaseCallback.java:56)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
为什么父类和子类存在相同属性呢,原本打算是通用属性放到父类,但因为用了greendao的库,greendao在保存对象的时候不会去读取父类的属性生成列因此只能在某个子类里加上跟父类相同的属性。但这有导致用'com.hjq:http:9.2'时报错。
能否加入请求参数的日志打印,这样好排查请求的参数导致的问题
请问可以对返回的数据进行拦截判断吗,比如返回的JSON数据中Code字段判断到指定的值,就当错误处理,产生onFail回调。
离线的话也能加载数据, 挺实用的
您好,我发现这个框架post请求只能用表单形式么,如果使用json形式就返回错误,我看了您的demo,启用gson模式后 @OverRide public BodyType getType() { // 参数以 Json 格式提交(默认是表单) return BodyType.JSON; },就会报错,但是我们公司现在api必须要用gson形式的,请指教
看上去很屌的样子,但举的例子看不懂啊
没看到相关文档,有请求示例吗?
Github沟通效率实在是很低下,大家伙有问题或者Bug直接到Q群78797078私信给我反馈就OK,我会尽快答复你的问题
目前只有地址和请求方式
请求加密问题
比如我们的APP请求都是对内容加密的,目前的方案是在intercept做加密,在RequestHandler的success和fail里面做解密,但总感觉不太合适,能否提供一个方法,这个方法是在success和fail的前面调用的,我们可以在这里做统一的解密
拦截器设计问题
登录问题,目前只看到在返回的时候判断返回的code里面的值判断是否是未登录状态。但实际上更好的办法是在客户端请求的时候就应该先判断本地token是否存在或者是否过期,如果不存在或者过期直接回调不用请求服务端。这个token判断是否过期用户可以放到intercept里面自己判断,另外IRequestApi应该提供或者用户自己定义一个注解,标识此接口是否需要登录才能调用,这些都可以在拦截器里实现。但目前拦截器的实现只是添加参数,拦截器的本质没有体现出来,就是不符合的请求要能在客户端拦截掉不需要请求服务端了。所以建议拦截器的方法里支持返回boolean,用户根据业务判断后如果需要继续请求就返回true,如果不需要继续请求而是直接回调结束那就返回false。
以上就是个人的使用体会,作者可以考虑一下。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.