首页 > 其他分享 >Http2Bean——基于OkHttp与Gson的网络请求工具

Http2Bean——基于OkHttp与Gson的网络请求工具

时间:2022-11-20 14:36:20浏览次数:40  
标签:String url param method bean OkHttp Http2Bean clazz Gson

public class Http2Bean<T> {
    private final OkHttpClient client = new OkHttpClient();
    private final Class<T> clazz;
    private final Request.Builder request;
    private String url = "";
    private String method = "GET";
    private Activity activity;

    /**
     * 初始化扫描传入的bean类,获取其Url注解上的附带信息
     * @param clazz 指定数据对应的bean
     */
    public Http2Bean(Class<T> clazz) {
        this.clazz = clazz;
        Url info = this.clazz.getAnnotation(Url.class);
        this.method = info.method();
        this.url = GlobalSetting.baseUrl + info.url();
        this.request = new Request.Builder().addHeader("Authorization", "").url(this.url);
    }

    /**
     * 执行请求
     *
     * @param param    请求参数,根据bean类附加信息,判断这次请求是什么方法,如果是get/delete方法则将参数拼接
     *                 在请求地址后面。如果是post/put方法则将参数转为JSON作为请求体发送。
     * @param callback 回调函数,用于请求到数据后使用这个数据执行一些动作。
     */
    public void execute(Object param, final H2BCallBack<T> callback) {
        RequestBody requestBody = null;

        if (param != null && !this.method.equals("GET") && !this.method.equals("DELETE")) {
            requestBody = RequestBody.create(new Gson().toJson(param), MediaType.parse("application/json;charset=UTF-8"));
        } else {
            this.request.url(this.url + "/" + param.toString());
        }

        RequestBody finalRequestBody = requestBody;
        Thread thread = new Thread(() -> {
            String result = null;
            try {
                result = this.client
                        .newCall(this.request.method(method, finalRequestBody).build())
                        .execute()
                        .body()
                        .string()
                        .replace("null", "\"0\"")
                        .replace("\\{\\}", "\"0\"");
            } catch (IOException e) {
                e.printStackTrace();
            }
            String finalResult = result;
            activity.runOnUiThread(() -> {
                T bean = new Gson().fromJson(finalResult, clazz);
                callback.invoke(bean);
            });
        });
        thread.start();
    }

    public Http2Bean<T> bind(Activity activity) {
        this.activity = activity;
        return this;
    }

    /**
     * 函数式接口,用作回调函数
     *
     * @param <T>
     */
    interface H2BCallBack<T> {
        /**
         * 唯一方法,满足函数式接口条件
         * @param bean 传入响应数据,在方法中进行得到数据后的操作。
         */
        void invoke(T bean);
    }

    /**
     * 注解,用于附加在bean类上,标记该bean类对应的请求地址以及请求方法
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Url {
        String url();

        String method() default "GET";
    }
}

标签:String,url,param,method,bean,OkHttp,Http2Bean,clazz,Gson
From: https://www.cnblogs.com/maplerain/p/16908411.html

相关文章

  • okHttp工具类
    importcom.google.gson.Gson;importokhttp3.*;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.util.StringUtils;importj......
  • Gson解析Json实例
          研究GSON花费了我一天的时间,期间出现了各种问题,第一次可以理解嘛,不过还好在安卓开发交流22群几位大神的帮助和我极大的耐心一下终于搞出来了,多谢几位大神,这里......
  • 【Java】okHttp3 简单使用
    之前用的RestTemplate,发现一个multipart的http请求始终发不成功,后面就试了下okHttp,发现真的好用,api太清爽了,记录一下使用:packagecom.liyao;importjava.io.FileInputStream......
  • 说说关于Android使用Gson解析Json所需实体类的那些事~
    LZ-Says:技术,真的是日积月累,厚积薄发~前言目前解析json的方法有很多种,LZ个人认为使用Gson还是一种很不错的选择,因为使用Gson时,我们只需要考虑将json中参数和实体类属性一一对......
  • 使用OkHttp发送POST请求的快速入门指南
    英文原文:https://www.baeldung.com/okhttp-post1介绍本文将介绍OkHttp客户端的基本用法。在本篇简短的技术文章中,我们将特别介绍OkHttp3.x版本中发送Post请求的不......
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gso
    错误如下: Description:Anattemptwasmadetocallthemethodcom.google.gson.GsonBuilder.setLenient()Lcom/google/gson/GsonBuilder;butitdoesnotexist.Itscl......
  • 【OkHttp框架】OkHttp框架原理与参数配置
    一、参考资料​​Okhttp的线程池|黑白了落夜的博客​​​​OKhttpClient简单使用总结「建议收藏」-腾讯云开发者社区-腾讯云​​......
  • GSON 特殊类型支持序列化和反序列化,如LocalDateTime
      GSON特殊类型支持序列化和反序列化,如LocalDateTime DateTimeFormatterdateTimeFormatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");Gsong......
  • 使用OKHttp发现的缺陷
    从Postman配置参数,发送请求能够正常返回结果。但是把Postman的代码复制到java代码(OKHttp)中,却出现了报错。参数我都调了好几遍了,还是报错,Postman的版本我也换过了,还是不行......
  • okHttp3集成
    Maven依赖pom:<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.0</version></dependency>代码:pac......