Android -- OkHttp的简单使用和封装

news2024/12/23 14:37:47

OkHttp的封装

由于是封装我们可以吧OKHttp和Gson给结合起来,那么我们在gradle文件添加以下的依赖

1

2

3

compile "com.squareup.okhttp:okhttp:2.4.0"

compile 'com.squareup.okio:okio:1.5.0'

compile "com.google.code.gson:gson:2.8.0"

  ①CallBack的创建  

  首选我们知道,当接口请求成功或者失败的时候我们需要将这个信息通知给用户,那么我们就需要创建一个抽象类RequestCallBack,请求前、成功、失败、请求后这几个方法,创建OnBefore()、OnAfter()、OnError()、OnResponse()对应

  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

/**

 * 在请求之前的方法,一般用于加载框展示

 *

 * @param request

 */

public void onBefore(Request request) {

}

/**

 * 在请求之后的方法,一般用于加载框隐藏

 */

public void onAfter() {

}

/**

 * 请求失败的时候

 *

 * @param request

 * @param e

 */

public abstract void onError(Request request, Exception e);

/**

 *

 * @param response

 */

public abstract void onResponse(T response);

 由于我们每次想要的数据不一定,所以这里我们用<T>来接收想要装成的数据格式,并通过反射得到想要的数据类型(一般是Bean、List)之类 ,所以RequestCallBack的整体代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

package com.qianmo.httprequest.http;

import com.google.gson.internal.$Gson$Types;

import com.squareup.okhttp.Request;

import java.lang.reflect.ParameterizedType;

import java.lang.reflect.Type;

/**

 * Created by wangjitao on 15/10/16.

 * 抽象类,用于请求成功后的回调

 */

public abstract class ResultCallback<T> {

    //这是请求数据的返回类型,包含常见的(Bean,List等)

    Type mType;

    public ResultCallback() {

        mType = getSuperclassTypeParameter(getClass());

    }

    /**

     * 通过反射想要的返回类型

     *

     * @param subclass

     * @return

     */

    static Type getSuperclassTypeParameter(Class<?> subclass) {

        Type superclass = subclass.getGenericSuperclass();

        if (superclass instanceof Class) {

            throw new RuntimeException("Missing type parameter.");

        }

        ParameterizedType parameterized = (ParameterizedType) superclass;

        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);

    }

    /**

     * 在请求之前的方法,一般用于加载框展示

     *

     * @param request

     */

    public void onBefore(Request request) {

    }

    /**

     * 在请求之后的方法,一般用于加载框隐藏

     */

    public void onAfter() {

    }

    /**

     * 请求失败的时候

     *

     * @param request

     * @param e

     */

    public abstract void onError(Request request, Exception e);

    /**

     *

     * @param response

     */

    public abstract void onResponse(T response);

}

  ②对Get、Post方法的简单封装 

  首先我们创建一个OkHttpClientManager类,由于是管理类,所以,单例加静态对象搞起

1

2

3

4

5

6

7

8

9

10

11

12

13

14

private static OkHttpClientManager mInstance;

 public static OkHttpClientManager getInstance() {

       if (mInstance == null){

           synchronized (OkHttpClientManager.class) {

               if (mInstance == null) {

                   mInstance = new OkHttpClientManager();

               }

           }

       }

       return mInstance;

   }

 在创建Manager对象的时候我们要把OkHttp的一些参数配置一下,顺便一提一下,由于我们我们异步get、post方法是运行在子线程中,所以这里我们添加了分发的 Handler mDelivery;,重写的OkHttpClientManager构造方法如下:

1

2

3

4

5

6

7

8

9

10

private OkHttpClientManager() {

       mOkHttpClient = new OkHttpClient();

       mOkHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);

       mOkHttpClient.setWriteTimeout(10, TimeUnit.SECONDS);

       mOkHttpClient.setReadTimeout(30, TimeUnit.SECONDS);

       //cookie enabled

       mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));

       mDelivery = new Handler(Looper.getMainLooper());

       mGson = new Gson();

   }

  前面的外部调用对象封装好了,这里我们开始来封装Get或Post方法,我这里以Post方法为例子,首先分析一下,post方法会有几个参数,参数一url,参数二参数params,参数三Callback(及我们上面的RequestCallBack)参数四flag(用于取消请求操作,可为空),基础代码如下:

1

2

3

4

5

6

7

8

9

10

/**

        * 通用基础的异步的post请求

        * @param url

        * @param callback

        * @param tag

        */

       public void postAsyn(String url, Param[] params, final ResultCallback callback, Object tag) {

           Request request = buildPostFormRequest(url, params, tag);

           deliveryResult(callback, request);

       }

  那么我们再看一下deliveryResult方法到底是干什么的

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

/**

    * 请求回调处理方法并传递返回值

    * @param callback Map类型请求参数

    * @param request Request请求

    */

   private void deliveryResult(ResultCallback callback, Request request) {

       if (callback == null)

           callback = DEFAULT_RESULT_CALLBACK;

       final ResultCallback resCallBack = callback;

       //UI thread

       callback.onBefore(request);

       mOkHttpClient.newCall(request).enqueue(new Callback() {

           @Override

           public void onFailure(final Request request, final IOException e) {

               sendFailedStringCallback(request, e, resCallBack);

           }

           @Override

           public void onResponse(final Response response) {

               try {

                   final String responseMessage=response.message();

                   final String responseBody = response.body().string();

                   if(response.code()==200){

                       if (resCallBack.mType == String.class) {

                           sendSuccessResultCallback(responseBody, resCallBack);

                       else {

                           Object o = mGson.fromJson(responseBody, resCallBack.mType);

                           sendSuccessResultCallback(o, resCallBack);

                       }

                   }else{

                       Exception exception=new Exception(response.code()+":"+responseMessage);

                       sendFailedStringCallback(response.request(), exception, resCallBack);

                   }

               catch (IOException e) {

                   sendFailedStringCallback(response.request(), e, resCallBack);

               catch (com.google.gson.JsonParseException e) {//Json解析的错误

                   sendFailedStringCallback(response.request(), e, resCallBack);

               }

           }

       });

   }

  可以看到,这个方法主要是发出请求并对请求后的数据开始回调,这样我们就基本上封装好了一个post方法了  ,把代码这一部分的代码贴出来看看

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

public class OkHttpClientManager {

    private static final String TAG = "com.qianmo.httprequest.http.OkHttpClientManager";

    private static OkHttpClientManager mInstance;

    //默认的请求回调类

    private final ResultCallback<String> DEFAULT_RESULT_CALLBACK = new ResultCallback<String>(){

        @Override

        public void onError(Request request, Exception e) {}

        @Override

        public void onResponse(String response) {}

    };

    private OkHttpClient mOkHttpClient;

    private Handler mDelivery;

    private Gson mGson;

    private GetDelegate mGetDelegate = new GetDelegate();

    private PostDelegate mPostDelegate = new PostDelegate();

    private DownloadDelegate mDownloadDelegate = new DownloadDelegate();

    private OkHttpClientManager() {

        mOkHttpClient = new OkHttpClient();

        mOkHttpClient.setConnectTimeout(10, TimeUnit.SECONDS);

        mOkHttpClient.setWriteTimeout(10, TimeUnit.SECONDS);

        mOkHttpClient.setReadTimeout(30, TimeUnit.SECONDS);

        //cookie enabled

        mOkHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER));

        mDelivery = new Handler(Looper.getMainLooper());

        mGson = new Gson();

    }

    public static OkHttpClientManager getInstance() {

        if (mInstance == null){

            synchronized (OkHttpClientManager.class) {

                if (mInstance == null) {

                    mInstance = new OkHttpClientManager();

                }

            }

        }

        return mInstance;

    }

    /**

     * 外部可调用的Post异步请求方法

     * @param url 请求url

     * @param params

     * @param callback 请求完成后回调类

     */

    public static void postAsyn(String url, Map<String, String> params, final ResultCallback callback) {

        getInstance().getPostDelegate().postAsyn(url, params, callback, null);

    }

    /**

         * 异步的post请求

         * @param url

         * @param params

         * @param callback

         * @param tag

         */

        public void postAsyn(String url, Map<String, String> params, final ResultCallback callback, Object tag) {

            Param[] paramsArr = map2Params(params);

            postAsyn(url, paramsArr, callback, tag);

        }

    /**

         * 通用基础的异步的post请求

         * @param url

         * @param callback

         * @param tag

         */

        public void postAsyn(String url, Param[] params, final ResultCallback callback, Object tag) {

            Request request = buildPostFormRequest(url, params, tag);

            deliveryResult(callback, request);

        }

     

    /**

     * 请求回调处理方法并传递返回值

     * @param callback Map类型请求参数

     * @param request Request请求

     */

    private void deliveryResult(ResultCallback callback, Request request) {

        if (callback == null)

            callback = DEFAULT_RESULT_CALLBACK;

        final ResultCallback resCallBack = callback;

        //UI thread

        callback.onBefore(request);

        mOkHttpClient.newCall(request).enqueue(new Callback() {

            @Override

            public void onFailure(final Request request, final IOException e) {

                sendFailedStringCallback(request, e, resCallBack);

            }

            @Override

            public void onResponse(final Response response) {

                try {

                    final String responseMessage=response.message();

                    final String responseBody = response.body().string();

                    if(response.code()==200){

                        if (resCallBack.mType == String.class) {

                            sendSuccessResultCallback(responseBody, resCallBack);

                        else {

                            Object o = mGson.fromJson(responseBody, resCallBack.mType);

                            sendSuccessResultCallback(o, resCallBack);

                        }

                    }else{

                        Exception exception=new Exception(response.code()+":"+responseMessage);

                        sendFailedStringCallback(response.request(), exception, resCallBack);

                    }

                catch (IOException e) {

                    sendFailedStringCallback(response.request(), e, resCallBack);

                catch (com.google.gson.JsonParseException e) {//Json解析的错误

                    sendFailedStringCallback(response.request(), e, resCallBack);

                }

            }

        });

    }

     /**

     * 处理请求成功的回调信息方法

     * @param object 服务器响应信息

     * @param callback 回调类

     */

    private void sendSuccessResultCallback(final Object object, final      ResultCallback callback) {

        mDelivery.post(() -> {

            callback.onResponse(object);

            callback.onAfter();

        });

    }

}    

  这样我们就把Post方法封装好了,同理Get方法,ok,现在我们可以来调用调用了,在调用之前我们可以对返回数据格式再来封装封装,一般我们后台返回的数据格式是类似如下:

1

2

3

4

5

{

 "code"200,

  "data": {},

 "message""登录成功"

}

 而data中有可能是对象,也有可能是数组,所以我们用两个类来实现一下

 CommonResultBean

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

package com.qianmo.httprequest.bean;

/**

 * 服务端返回通用接收实体

 * Created by wangjitao on 15/10/30.

 */

public class CommonResultBean<T> {

    private String code;

    private T data;

    private String message;

    public String getCode() {

        return code;

    }

    public void setCode(String code) {

        this.code = code;

    }

    public T getData() {

        return data;

    }

    public void setData(T data) {

        this.data = data;

    }

    public String getMessage() {

        return message;

    }

    public void setMessage(String message) {

        this.message = message;

    }

}

 CommonResultListBean

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

package com.qianmo.httprequest.bean;

import java.util.List;

/**

 * 服务端返回带有List数据的通用接收实体

 * Created by wangjitao on 15/12/1.

 */

public class CommonResultListBean<T> {

    private String code;

    private List<T> data;

    private String message;

    public String getCode() {

        return code;

    }

    public void setCode(String code) {

        this.code = code;

    }

    public List<T> getData() {

        return data;

    }

    public void setData(List<T> data) {

        this.data = data;

    }

    public String getMessage() {

        return message;

    }

    public void setMessage(String message) {

        this.message = message;

    }

}

  ok,现在还是以上面我们登录的接口为例子开始我们的方法调用,返回的数据格式如图所示

  我们创建UserMenu.java类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

package com.qianmo.httprequest.bean;

import java.util.List;

/**

 * Created by wangjitao on 2016/12/21 0021.

 * E-Mail:543441727@qq.com

 * 用户菜单权限按钮

 */

public class UserMenu {

    /**

     * last_login_time : 2016-12-21 15:40:28

     * member_id : 1

     * modules : []

     * phone : 18900532225

     * real_name : 超级管理员

     * role : {"role_id":1,"role_name":"超级管理员"}

     * username : superadmin

     */

    private String last_login_time;

    private int member_id;

    private String phone;

    private String real_name;

    /**

     * role_id : 1

     * role_name : 超级管理员

     */

    private RoleBean role;

    private String username;

    /**

     * module_code : 100

     * module_id : 1

     * module_name : 首页

     * pid : 0

     * type : 1

     * value : P_index

     */

    private List<ModulesBean> modules;

    public String getLast_login_time() {

        return last_login_time;

    }

    public void setLast_login_time(String last_login_time) {

        this.last_login_time = last_login_time;

    }

    public int getMember_id() {

        return member_id;

    }

    public void setMember_id(int member_id) {

        this.member_id = member_id;

    }

    public String getPhone() {

        return phone;

    }

    public void setPhone(String phone) {

        this.phone = phone;

    }

    public String getReal_name() {

        return real_name;

    }

    public void setReal_name(String real_name) {

        this.real_name = real_name;

    }

    public RoleBean getRole() {

        return role;

    }

    public void setRole(RoleBean role) {

        this.role = role;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public List<ModulesBean> getModules() {

        return modules;

    }

    public void setModules(List<ModulesBean> modules) {

        this.modules = modules;

    }

    public static class RoleBean {

        private int role_id;

        private String role_name;

        public int getRole_id() {

            return role_id;

        }

        public void setRole_id(int role_id) {

            this.role_id = role_id;

        }

        public String getRole_name() {

            return role_name;

        }

        public void setRole_name(String role_name) {

            this.role_name = role_name;

        }

    }

    public static class ModulesBean {

        private String module_code;

        private int module_id;

        private String module_name;

        private int pid;

        private int type;

        private String value;

        public String getModule_code() {

            return module_code;

        }

        public void setModule_code(String module_code) {

            this.module_code = module_code;

        }

        public int getModule_id() {

            return module_id;

        }

        public void setModule_id(int module_id) {

            this.module_id = module_id;

        }

        public String getModule_name() {

            return module_name;

        }

        public void setModule_name(String module_name) {

            this.module_name = module_name;

        }

        public int getPid() {

            return pid;

        }

        public void setPid(int pid) {

            this.pid = pid;

        }

        public int getType() {

            return type;

        }

        public void setType(int type) {

            this.type = type;

        }

        public String getValue() {

            return value;

        }

        public void setValue(String value) {

            this.value = value;

        }

    }

}

  所以MainActivity代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

package com.qianmo.httprequest;

import android.os.Environment;

import android.os.Handler;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;

import com.qianmo.httprequest.bean.CommonResultBean;

import com.qianmo.httprequest.bean.UserMenu;

import com.qianmo.httprequest.http.IRequestCallBack;

import com.qianmo.httprequest.http.IRequestManager;

import com.qianmo.httprequest.http.OkHttpClientManager;

import com.qianmo.httprequest.http.RequestFactory;

import com.qianmo.httprequest.http.ResultCallback;

import com.squareup.okhttp.Call;

import com.squareup.okhttp.Callback;

import com.squareup.okhttp.FormEncodingBuilder;

import com.squareup.okhttp.OkHttpClient;

import com.squareup.okhttp.Request;

import com.squareup.okhttp.RequestBody;

import com.squareup.okhttp.Response;

import java.io.File;

import java.io.IOException;

import java.util.HashMap;

import java.util.Map;

public class MainActivity extends AppCompatActivity implements OnClickListener {

    private Handler handler;

    private TextView tv_message;

    private Button btn_login;

    private ProgressBar progressBar;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        tv_message = (TextView) findViewById(R.id.tv_message);

        btn_login = (Button) findViewById(R.id.btn_login);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        handler = new Handler();

        btn_login.setOnClickListener(this);

    }

    @Override

    public void onClick(View view) {

        progressBar.setVisibility(View.VISIBLE);

        String url = "http://192.168.1.123:8081/api/login";

        Map<String, String> params = new HashMap();

        params.put("username""superadmin");

        params.put("pwd""ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413");

        OkHttpClientManager.postAsyn(url, params,

                new ResultCallback<CommonResultBean<UserMenu>>() {

                    @Override

                    public void onError(Request request, Exception e) {

                    }

                    @Override

                    public void onResponse(CommonResultBean<UserMenu> response) {

                        if (response.getData() != null) {

                            UserMenu userMenu = response.getData();

                            tv_message.setText(userMenu.getReal_name());

                            progressBar.setVisibility(View.GONE);

                        }

                    }

                });

    }

}

  这样我们就可以简单的调用了,最后看一下我们的效果:

 See You Next Time···

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (April 2023)

适用于 Android™️ 的 Windows 子系统&#xff0c;2023 年 4 月更新 (April 2023) 请访问原文链接&#xff1a;https://sysin.cn/blog/wsa/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Windows 11 上适用于 Android™ 的 …

在Windbg中设置断点追踪打开C++程序远程调试开关的模块

目录 1、Windbg动态调试 2、在Windbg中设置断点 2.1、在函数入口处设置断点 2.2、在函数内部某一行上设置断点 3、设置断点跟踪对打开远程调试开关接口的调用 3.1、编写演示代码 3.2、在Windbg中设置调用SetRemoteDebugOn接口的断点进行跟踪 4、最后 VC常用功能开发汇总…

这一次,吃了Redis的亏,也败给了GPT

关注【离心计划】&#xff0c;一起离开地球表面 背景 组内有一个系统中有一个延迟任务的需求&#xff0c;关于延迟任务常见的做法有时间轮、延迟MQ还有Redis Zset等方案&#xff0c;关于时间轮&#xff0c;这边小苏有一个大学时候做的demo&#xff1a; https://github.com/JA…

Cacti监控远程linux机器配置(被监控端)

一、被监控机安装snmp yum -y install snmp二、被监控机的配置 vi /etc/snmp/snmpd.conf做以下更改&#xff1a; 1、找到com2sec notConfigUser default public 改为&#xff1a;com2sec notConfigUser 192.168.1.1(改成监控服务器的ip) public 2、找到acce…

【hello Linux】进程概念(上)

目录 1.操作系统&#xff08;OS&#xff09; 2. 进程 2.1 基本概念 2.2 task_struct 内的属性字段 2.3 查看进程 2.4 查看进程的PID及PPID 2.5 杀死进程 2.6 以文件的方式查看进程 2.7 查看退出码 2.8 上下文数据 下面介绍两个较为方便的快捷键&#xff1a; Linux&#x1f337;…

语义分割新范式:上海 AI Lab 联合北邮、商汤提出StructToken

来源&#xff1a;投稿 作者&#xff1a;xin 编辑&#xff1a;学姐 Motivation 本文将当前语义分割的方法分为两类&#xff0c;一类是静态逐像素分类方法&#xff08;static per-pixel classification&#xff09;&#xff0c;另一类为动态逐像素分类方法&#xff08;dynamic p…

Ubuntu备份与恢复

Ref: create-backup-image-of-running-ubuntu Linux中我们有权访问所有系统文件&#xff0c;因此&#xff0c;最简单且直接的备份方法是将整个根目录打包&#xff1a; sudo su tar -cpzf /path/to/backup.tar.gz --exclude/tmp --one-file-system /其中-cpzf 表示建立压缩归档…

MQTT 持久会话与 Clean Session

1. 会话&#xff08;session&#xff09; 我们将从客户端向服务端发起 MQTT 连接请求开始&#xff0c;到连接中断直到会话过期为止的消息收发序列称之为会话。会话是服务端和客户端的一个连接&#xff0c;进行消息交互前必须先建立会话。 2. 会话的生命周期 MQTT v3.1.1会话…

003_螺旋矩阵

力扣54和59题 54.顺时针打印矩阵 题目&#xff1a; 思路&#xff1a;将矩阵分为若干层&#xff0c;首先打印最外层的元素&#xff0c;然后一直往里打印 对于每层&#xff0c;从左上方开始以顺时针的顺序遍历所有元素。假设当前层的左上角位于(top,left)&#xff0c;右下角位于…

Axios请求(对于ajax的二次封装)——Axios取消请求、请求体编码

Axios请求&#xff08;对于ajax的二次封装&#xff09;——Axios取消请求、请求体编码知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货axios取消请求AbortControllerCancelToken deprecated请求体编码浏览器qs库编码数据ES6库方法node.jsQuery stri…

【神经网络】tensorflow实验3--NumPy科学计算库

目录 1. 实验目的 2. 实验内容 3. 实验过程 题目一&#xff1a; ① 代码 ② 实验结果 题目二&#xff1a; ① 代码 ② 实验结果 题目三&#xff1a; ​编辑 ① 代码 ② 实验结果 5. 实验小结 ① 实验过程中遇到了哪些问题&#xff0c;你是如何解决的&#xff1f; …

Android引入Apollo(阿波罗)

程序猿日常 记Android项目引入Apollo(阿波罗)上源码 apollo开发分支 应用 Apollo(阿波罗)客户端会管理好应用的后台GraphQL数据 之前网络请求使用RetrofitOkHttp 改成使用ApolloOkHttp 引入 1.对应的module的build.gradle中添加 id("com.apollographql.apollo3&qu…

【计算机系统概论Yale.patt】第一章

文章目录1. 计算机是简单部件的系统组合1.1 计算机组成1.1.1 编码体系1.1.2 晶体管构建微处理器1.1.3 冯诺依曼机1.1.4 LC-3机(冯诺依曼机实现)1.1.5 LC-3编程机器语言编程汇编语言编程输入输出信息问题两个重要机制栈和数据转换示例&#xff1a;计算器1.2 两个重要理念1.2.1 抽…

Linux基础篇(三)常见指令

目录 一、创建文件和目录 二、命令详解 0. 命令和选项 1. ls命令 2. cd命令 3. touch命令 4. mkdir命令 5. tree命令 6. rmdir命令 7. rm命令 8. man 9. nano 10. cat命令 11. cp 命令 12. mv 命令 13. echo命令 14. more命令 15. less命令 16. Ctrl C 17. head 命令 18. tail…

台灯的种类有哪些?国内热门护眼灯品牌推荐

台灯是我们日常生活中常见的电器之一&#xff0c;台灯不仅可以为人们照明&#xff0c;还可以用来家居装饰&#xff0c;根据人们不用的需求&#xff0c;台灯的种类也很多&#xff0c;有书房台灯、读写台灯、工艺台灯。 书房台灯&#xff1a;灯光的局部照明效果&#xff0c;以书写…

禅道OpenAI更新至1.2版本,超多实用功能惊喜上线!

广受欢迎的禅道OpenAI插件近日成功发布&#xff0c;截至目前已更新至1.2版本。 截至本版本发布&#xff0c;禅道OpenAI已经拥有了神奇海螺&#xff08;ChatGPT聊天&#xff09;、需求润色、任务润色、Bug润色及本次的需求一键生成用例功能&#xff0c;仍有更多实用的新功能正在…

Sentinel 工作主流程

Overview 在 Sentinel 里面&#xff0c;所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建&#xff0c;也可以通过注解的方式或调用 API 显式创建&#xff1b;每一个 Entry 创建的时候&#xff0c;同时也会创建一系列功能插槽&#xff08;…

2023年第1季社区Task挑战赛开启,等你来战!

社区Task挑战赛是面向社区开发者开展的代码或教程征集活动。该挑战赛为社区中热爱FISCO BCOS及周边组件的开发者提供了探索区块链技术、挑战技术难题的舞台。该挑战赛去年在社区成功举办了3季&#xff0c;共吸引了数百名开发者报名。 前3季都有哪些有趣的作品&#xff1f; 在…

【图数据挖掘】— 子图同构问题、单射函数和双射函数、同构(isomorphic)和同态(homomorphism)

子图同构问题 子图同构&#xff08;Subgraph Isomorphism&#xff09;是指在图论中&#xff0c;两个图之间是否存在一种关系&#xff0c;使得其中一个图的顶点集合和边集合可以通过对应的方式映射到另一个图的顶点集合和边集合上&#xff0c;且保持原来的边和顶点的关系不变。…

如何设计一个安全的对外接口?

对外接口安全措施的作用主要体现在两个方面&#xff0c;一方面是如何保证数据在传输过程中的安全性&#xff0c;另一方面是数据已经到达服务器端&#xff0c;服务器端如何识别数据。 1. 数据加密 数据在传输过程中是很容易被抓包的&#xff0c;如果直接传输&#xff0c;数据可…