EasyHttp icon indicating copy to clipboard operation
EasyHttp copied to clipboard

使用GET方式请求数据时能否增加一个参数用于支持Map传参?

Open Fomovet opened this issue 1 year ago • 2 comments

建议收集

  • 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)))

Fomovet avatar Jul 23 '22 06:07 Fomovet

小伙子,你为什么要传两遍参数?在 Activity / Fragment 调用 TestViewModel 的时候为什么不直接传入 api 类?

getActivity avatar Jul 24 '22 14:07 getActivity

简单的页面传参是可以将TestApi类直接传给TestViewModel类 ,但实际上在较复杂的页面传参就显得有点费劲了,举个比较常见的页面逻辑:头部N种条件筛选+底部ViewPage2+Fragment组成,每当筛选条件改变时Fragment都需要动态从Activity获取参数并更新列表,这时候如果能在Activity中能使用Map将参数装载好,Fragment获取Activity中装载好的Map再传给TestViewModel,这时候参数的传递简单许多了,也能动态的添加、删除参数了

Fomovet avatar Jul 25 '22 04:07 Fomovet

我想自定义 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) {
                
            }
        });
  • 需要注意的是:这种实现方式仅适用于在框架设计无法满足需求的情况下,其他情况下作者并不提倡用这种方式,还是推荐大家使用在类上面定义字段的方式来实现。

getActivity avatar Sep 17 '22 14:09 getActivity

@Fomovet 小伙子,我慎重思考了这个问题很久很久,最终决定不开放这种方式,因为一旦开放将会引发很多人采用这种方式来实现网络请求,这并不是我的初心,我做这个框架的初心是为了不让请求参数的 key 暴露给外层。不过你可以用我上面说的方式来实现。

getActivity avatar Sep 17 '22 16:09 getActivity

好的,感谢前辈提供的解决方案,这也是一种不错的解决思路。

Fomovet avatar Sep 20 '22 05:09 Fomovet