EasyHttp
EasyHttp copied to clipboard
使用GET方式请求数据时能否增加一个参数用于支持Map传参?
建议收集
-
issue 是否有人曾提过类似的问题? 答:有一个类似的
-
你觉得框架有什么不足之处? 答:目前发现有些GET请求的接口需要传十几个参数,由于网络请求是放在ViewModel中统一管理然后再提供给Activity或Fragment调用,所以这时候就需要写很多次传参了。首先要在TestApi.class中把参数定义好,TestViewModel.class中调用TestApi.class时将参数传递并设置进去,最后Activity或Fragment调用TestViewModel.class时还需要再传一次,这时候如果能使用Map传参只需要在Activity或Fragment中将Map和参数定义好,接着再传递给TestViewModel.class整个传参过程将会得到很大的简化,随便还实现了GET请求动态参数的传递
-
你觉得该怎么去完善会比较好? 答:是否可以增加一个方法类似于POST请求时map转Json的传参方式?
.body(new JsonBody(new Gson().toJson(mMap)))
小伙子,你为什么要传两遍参数?在 Activity / Fragment 调用 TestViewModel 的时候为什么不直接传入 api 类?
简单的页面传参是可以将TestApi类直接传给TestViewModel类 ,但实际上在较复杂的页面传参就显得有点费劲了,举个比较常见的页面逻辑:头部N种条件筛选+底部ViewPage2+Fragment组成,每当筛选条件改变时Fragment都需要动态从Activity获取参数并更新列表,这时候如果能在Activity中能使用Map将参数装载好,Fragment获取Activity中装载好的Map再传给TestViewModel,这时候参数的传递简单许多了,也能动态的添加、删除参数了
我想自定义 Get 请求参数中的 key 和 value 该怎么做
- 先自定义一个 Api 类,然后通过
getApi
方法将参数动态拼接上去
public final class CustomParameterApi implements IRequestApi {
@HttpIgnore
@NonNull
private final Map<String, String> parameters;
public CustomParameterApi() {
this(new HashMap<>());
}
public CustomParameterApi(@NonNull Map<String, String> parameters) {
this.parameters = parameters;
}
@NonNull
@Override
public String getApi() {
Set<String> keys = parameters.keySet();
StringBuilder builder = new StringBuilder();
int index = 0;
for (String key : keys) {
String value = parameters.get(key);
if (index == 0) {
builder.append("?");
}
builder.append(key)
.append("=")
.append(value);
if (index < keys.size() - 1) {
builder.append("&");
}
index++;
}
return "xxx/xxx" + builder;
}
public CustomParameterApi putParameter(String key, String value) {
parameters.put(key, value);
return this;
}
public CustomParameterApi removeParameter(String key) {
parameters.remove(key);
return this;
}
}
- 外层可以通过以下方式进行调用
CustomParameterApi api = new CustomParameterApi();
api.putParameter("key1", "value1");
api.putParameter("key2", "value2");
EasyHttp.get(this)
.api(api)
.request(new HttpCallback<Xxx>(this) {
@Override
public void onSucceed(Xxx result) {
}
});
- 需要注意的是:这种实现方式仅适用于在框架设计无法满足需求的情况下,其他情况下作者并不提倡用这种方式,还是推荐大家使用在类上面定义字段的方式来实现。
@Fomovet 小伙子,我慎重思考了这个问题很久很久,最终决定不开放这种方式,因为一旦开放将会引发很多人采用这种方式来实现网络请求,这并不是我的初心,我做这个框架的初心是为了不让请求参数的 key 暴露给外层。不过你可以用我上面说的方式来实现。
好的,感谢前辈提供的解决方案,这也是一种不错的解决思路。