当前位置: 首页 > news >正文

Android 网络编程-网络请求

Android 网络编程-网络请求

文章目录

  • Android 网络编程-网络请求
    • 一、主要内容
    • 二、开发网络请求前的基本准备
      • 1、查看需要请求的网址是否有效
        • (1)通过网页在线验证
        • (2)使用专用window网咯请求工具
        • (3)编写app代码验证
      • 2、学会把服务器的json数据转换成Bean对象
      • 3、具体效果测试
        • 简单测试的网址:
          • 天气api:
          • apipost调试网址
        • (1)get请求,在浏览器窗口栏请求的显示
        • (2)get请求在在线请求网址的显示
        • (3)post请求在在线请求的的网址显示
        • (4)json数据在线转换成Bean对象
        • 应用app效果显示;
    • 三、代码介绍
      • 1、普通网络请求
        • (1)get网络请求
        • (2)Post网络请求
      • 2、使用OkHttp网络框架请求网络
        • (1)Get网络请求
        • (2)Post网络请求
      • 3、使用Retrofit网络框架请求网络
        • (1)Get网络请求
          • ①创建请求接口对象
          • ② 具体的请求代码
        • (2)Post网络请求
          • ①创建请求接口对象
          • ② 具体的请求代码
      • 4、使用WebView显示对应网址的网页
        • (1)在布局文件写入控件WebView
        • (2) 设置基本参数
    • 三、总结
      • 1、网络请求是要在子线程内进行
      • 2、不同框架的网络请求根据项目具体情况使用
      • 3、Android 网络编程要学习些什么
        • (1)网络分层和HTTP协议基本知识,比如请求报文和响应报文
        • (2)Java网络编程基础,TCP/UDP 进行连接交互
        • (3)Json数据转Gson对象
        • (4)Android基本网络请求和基本网络框架使用
        • (5)加密算法:数据加密和解密

本文介绍一下Android 网络请求,开发了简单demo,适合Android入门人员学习。

为啥要写这个??给应届生看的。。。

一、主要内容

1、开发网络请求前的基本准备
2、普通网络请求代码
3、使用OkHttp网络框架请求网络代码
4、使用Retrofit网络框架请求网络代码
5、使用WebView显示对应网址的网页
6、应用demo的相关代码和apk

二、开发网络请求前的基本准备

1、查看需要请求的网址是否有效

(1)通过网页在线验证

能验证get请求和简单的post 请求,比如只设置几个参数的post请求
在线get/post请求测试(里面还有一系列工具):
http://www.jsons.cn/httpurl/
http://coolaf.com/

//可以简单模拟 get/post返回的数据
https://v7.apipost.cn/#/apis/design

(2)使用专用window网咯请求工具

① PostMan
② Apifox (国内自研,PostMan加强版,支持网页和桌面工具)
https://apifox.com/#pricing

(3)编写app代码验证

一般用于验证文件上传的情况,
也可以用windows 工具进行验证,Apifox 也是支持文件上传的。

2、学会把服务器的json数据转换成Bean对象

在线转换Json格式转换JAVA实体Bean类:
http://www.jsons.cn/json2java/

作用?
把字符串的数据赋值到对象,使用的时候直接使用 Object.getXXX 获取返回的某个信息。

也可以使用Android Studio 插件:GsonFormat

3、具体效果测试

get请求测试,可以找网上天气网址的api或者笑话类的api网址;
post请求测试,可以找地图类的api(百度地图),或者语音类的api网址(讯飞)。

简单测试的网址:

天气api:

提供天气,气象查询:https://www.yiketianqi.com/index/doc
get请求网址;
https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000

apipost调试网址

提供get/post简单调试功能:https://v7.apipost.cn/#/apis/design
注册登陆后,看起来是可以设计返回的数据的,估计是操作要麻烦一点,有需要的可以自己研究。

post请求网址:
https://demo-api.apipost.cn/api/demo/login
mobile=18289454846&ver_code=123456

(1)get请求,在浏览器窗口栏请求的显示

在这里插入图片描述

(2)get请求在在线请求网址的显示

在这里插入图片描述

(3)post请求在在线请求的的网址显示

post 请求在浏览器输入行直接是无法请求到数据的,只能使用专业的网址或者工具 获取post请求的数据。

在这里插入图片描述

(4)json数据在线转换成Bean对象

在这里插入图片描述

应用app效果显示;

主界面:
在这里插入图片描述

普通网络请求:

在这里插入图片描述

OkHttp网络请求:
在这里插入图片描述

retrofit网络请求:
在这里插入图片描述
为啥这里TextView显示的不对,大家可以在代码里面看看。

WebView界面:
在这里插入图片描述

应用demo里面显示了很多WebView界面,这里只展示其中一个。

代码资源下载地址:

https://download.csdn.net/download/wenzhi20102321/88215651

三、代码介绍

1、普通网络请求

网络请求一定要在子线程执行,否则会报错。
数据返回后要显示在界面上要切换回主线程。

(1)get网络请求

    //get方法请求网络public void getNetwork(View view) {GET_UTL = et_url_get.getText().toString();LogUtil.debugInform("GET_UTL = " + GET_UTL);//创建线程,请求网络new Thread(new Runnable() {@Overridepublic void run() {// 创建一个URL对象URL url = null;try {url = new URL(GET_UTL);// 创建一个HttpURLConnection对象,并设置请求方法为GETHttpURLConnection connection = null;connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);// 获取服务器响应的状态码int responseCode = 0;responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 读取服务器响应的数据BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line); //把读取的数据不断放入response对象中}reader.close();// 在UI线程中更新UI  runOnUiThreadString responseData = response.toString();}} catch (Exception e) {e.printStackTrace();LogUtil.error("", e);}}}).start();}

(2)Post网络请求

//post方法请求王网络public void postNetwork(View view) {//创建线程,请求网络new Thread(new Runnable() {@Overridepublic void run() {// 创建一个URL对象URL url = null;try {url = new URL(POST_UTL);// 创建一个HttpURLConnection对象,并设置请求方法为GETHttpURLConnection connection = null;connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);//------------------------------ 区别和Get方法 ,Startconnection.setRequestMethod("POST");// 启用输出流,以便向服务器发送数据connection.setDoOutput(true);// 创建一个输出流对象,并将数据写入输出流OutputStream outputStream = connection.getOutputStream();String postData = POST_MESSAGE;outputStream.write(postData.getBytes());outputStream.flush();outputStream.close();//------------------------------ 区别和Get方法 ,End// 获取服务器响应的状态码int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {// 读取服务器响应的数据BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line); //把读取的数据不断放入response对象中}reader.close();// 在UI线程中更新UI// 处理服务器响应的数据String responseData = response.toString();}} catch (Exception e) {e.printStackTrace();LogUtil.error("", e);}}}).start();}

2、使用OkHttp网络框架请求网络

(1)Get网络请求

//get方法请求网络public void getNetwork(View view) {Request request = new Request.Builder().url(GET_UTL).get() //默认为get ,不设置也行.build();Call call = client.newCall(request);//网络请求的回调call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Toast.makeText(OkhttpNetworkActivity.this, "请求错误:" + e.getMessage(), Toast.LENGTH_LONG).show();}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {// 处理服务器响应的数据String responseData = response.body().string();LogUtil.debugInform("responseData = " + responseData);// TODO: 在这里处理服务器响应的数据}});}

(2)Post网络请求

//post方法请求王网络public void postNetwork(View view) {//创建网络处理的对象OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();//mobile=18289454846&ver_code=123456//post请求来获得数据//创建一个RequestBody,存放重要数据的键值对RequestBody body = new FormBody.Builder().add("mobile", "18289454846").add("ver_code", "123456").build();//创建一个请求对象,传入URL地址和相关数据的键值对的对象Request request = new Request.Builder().url(POST_UTL).post(body).build();//创建一个能处理请求数据的操作类Call call = client.newCall(request);//使用异步任务的模式请求数据call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {LogUtil.error("", e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {// 在UI线程中更新UIString responseData = response.body().string();LogUtil.debugInform("result = " + responseData);}});}

3、使用Retrofit网络框架请求网络

(1)Get网络请求

请求示例网址:
https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000

①创建请求接口对象
package com.example.networkdemo.retrofit;import com.example.networkdemo.bean.WeatherBean;import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;/*** Get请求* 这里使用get请求的方式请求数据* 并且到的是字符串数据*/
public interface RetrofitWeatherService {//键值对的定义和数据的返回类型的定义这里是String//https://v0.yiketianqi.com/api?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000//这里使用 @Field 是会报错,是要使用 @Query@GET("api")//get请求方式Call<WeatherBean> getWeather(@Query("unescape") String unescape, @Query("version") String version,@Query("appid") String appid, @Query("appsecret") String appsecret, @Query("adcode") String adcode);
}
② 具体的请求代码

比如在某个Activity写如下代码

//get方法请求网络public void getNetwork(View view) {Retrofit retrofit = getGsonRetrofit(GET_UTL);RetrofitWeatherService weatherService = retrofit.create(RetrofitWeatherService.class);//?unescape=1&version=v61&appid=28392918&appsecret=No9zfo8f&adcode=440307000000"Call<WeatherBean> call = weatherService.getWeather("1", "v61", "28392918", "No9zfo8f", "440307000000");//转换成Call,在call对象包含Url的完整地址//可以看到这里使用了create的方法,里面传入了请求服务的接口类//并且后面接的是接口类的方法,方法里面传入Url地址要的键值对的值//这时call对象就有完整的Url地址,就可以请求数据了//使用call对象进行网络数据请求call.enqueue(new Callback<WeatherBean>() {//网络数据请求成功的回调方法@Overridepublic void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {runOnUiThread(new Runnable() {@Overridepublic void run() {WeatherBean bean = response.body();tv_info.setText(TimeUtil.getTimeString() + " \n Get请求的数据:" + bean + "");String air_tips = bean.getAir_tips();String update_time = bean.getUpdate_time();String tem1 = bean.getTem1();String tem2 = bean.getTem2();String tem = bean.getTem();Toast.makeText(RetrofitNetworkActivity.this, "天气时间:" + update_time+ "\n 当前温度:" + tem + ",温度变化" + tem2 + "--" + tem1 +"\n 温馨提示:" + air_tips, Toast.LENGTH_LONG).show();}});}//网络数据请求失败的回调方法@Overridepublic void onFailure(Call<WeatherBean> call, Throwable t) {tv_info.setText(TimeUtil.getTimeString() + " \n Get 请求的失败日志:" + t.getMessage() + "");}});}

(2)Post网络请求

Post请求网址:https://demo-api.apipost.cn/api/demo/login
携带信息:mobile=18289454846&ver_code=123456

①创建请求接口对象
package com.example.networkdemo.retrofit;import com.example.networkdemo.bean.LoginBean;import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;/*** 登陆服务器的请求* 这里使用post请求的方式请求数据* 并且到的是一个自定义的对象数据*/
public interface RetrofitLoginService {//https://demo-api.apipost.cn/api/demo/login@POST("api/demo/login")//Post请求方式@FormUrlEncoded      //键值对的定义和数据的返回类型的定义这里是StringCall<LoginBean> login(@Field("mobile") String mobile, @Field("ver_code") String ver_code);
}
② 具体的请求代码
//post方法请求王网络public void postNetwork(View view) {Retrofit retrofit = getGsonRetrofit(POST_UTL); //https://demo-api.apipost.cn/RetrofitLoginService loginService = retrofit.create(RetrofitLoginService.class);Call<LoginBean> call = loginService.login("18289454846", "123456");call.enqueue(new Callback<LoginBean>() {@Overridepublic void onResponse(Call<LoginBean> call, Response<LoginBean> response) {// 在UI线程中更新UIrunOnUiThread(new Runnable() {@Overridepublic void run() {// 处理服务器响应的数据LoginBean loginBean = response.body();LogUtil.debugInform("loginBean = " + loginBean);int code = loginBean.getCode();LoginBean.DataBean data = loginBean.getData();String msg = loginBean.getMsg();Toast.makeText(RetrofitNetworkActivity.this, "登陆信息:" +"\n code = " + code + ", msg = " + msg, Toast.LENGTH_LONG).show();LogUtil.debugInform("data getToken = " + data.getToken());// TODO: 在这里处理服务器响应的数据tv_info.setText(TimeUtil.getTimeString() + " \n Post请求的数据:" + response + "");}});}@Overridepublic void onFailure(Call<LoginBean> call, Throwable t) {runOnUiThread(new Runnable() {@Overridepublic void run() {tv_info.setText(TimeUtil.getTimeString() + " \n Post请求的失败日志:" + t.getMessage() + "");}});}});}//返回一个Gson类型的对象public Retrofit getGsonRetrofit(String url) {Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(GsonConverterFactory.create()).build();return retrofit;}//返回一个Gson类型的字符串,public Retrofit getStringRetrofit(String url) {Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(ScalarsConverterFactory.create()).build();return retrofit;}

4、使用WebView显示对应网址的网页

(1)在布局文件写入控件WebView

   <WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent" />

(2) 设置基本参数

web_view = findViewById(R.id.web_view);WebSettings webSettings = web_view.getSettings();//如果访问的页面中要与Javascript交互,则webview必须设置支持JavascriptwebSettings.setJavaScriptEnabled(true);webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式//要显示的网址:web_view.loadUrl(url); //设置网址

这里只是基本代码,还可以设置跳转监听,前进后退网页跳转等,可以自己调试研究。

三、总结

1、网络请求是要在子线程内进行

2、不同框架的网络请求根据项目具体情况使用

如果频率很多的使用网络请求,直接使用原生请求即可,不用使用网络框架。
如果使用频率很高,可以使用健全的网络框架:OkHttp/Retrofit;
OkHttp使用简单,Retrofit 使用复杂一些,但是和很多其他框架可以结合使用,比如Gson,RxJava等。

3、Android 网络编程要学习些什么

(1)网络分层和HTTP协议基本知识,比如请求报文和响应报文

虽然不一定会用到,但是也是要知道里面的知识点。

(2)Java网络编程基础,TCP/UDP 进行连接交互

可以写demo,一个作为客户端一个作为服务端,连接后进行通讯交互。

(3)Json数据转Gson对象

网络上数据请求基本都是返回json数据,使用Gson对象可以直接转换成对应的对象,使用起来比较方便。

但是也有一些网络请求返回的数据不是json数据格式,比如xml格式,或者其他特定格式。
这个就需要自己写工具类进行解析了。

(4)Android基本网络请求和基本网络框架使用

不使用网络框架请求网络和使用主流网络框架请求网络。

(5)加密算法:数据加密和解密

因为网络数据是经过加密的,所以必须要经过解密才能读取到正常数据。
算法是会使用框架就行了的,具体算法一般人写不出来!

相关文章:

Android 网络编程-网络请求

Android 网络编程-网络请求 文章目录 Android 网络编程-网络请求一、主要内容二、开发网络请求前的基本准备1、查看需要请求的网址是否有效&#xff08;1&#xff09;通过网页在线验证&#xff08;2&#xff09;使用专用window网咯请求工具&#xff08;3&#xff09;编写app代码…...

Mac下全选,使用pynput,怎样调用command键?

Key.command 不行&#xff0c;用Key.cmd 。 win或linux下&#xff1a; with keyboard.pressed(Key.ctrl):keyboard.press(a)time.sleep(1)keyboard.release(a) 那么在mac下就是&#xff1a; with keyboard.pressed(Key.cmd):keyboard.press(a)time.sleep(1)keyboard.rel…...

21款美规奔驰GLS450更换中规高配主机,汉化操作更简单

很多平行进口的奔驰GLS都有这么一个问题&#xff0c;原车的地图在国内定位不了&#xff0c;语音交互功能也识别不了中文&#xff0c;原厂记录仪也减少了&#xff0c;使用起来也是很不方便的。 可以实现以下功能&#xff1a; ①中国地图 ②语音小助手&#xff08;你好&#xf…...

R语言ggplot2 | R语言绘制物种组成面积图(三)

&#x1f4cb;文章目录 面积图简介准备数据集加载数据集数据处理数据可视化 利用R语言绘制物种组成图。本文以堆叠面积图的方式与大家分享。 面积图简介 面积图又叫区域图。它是在折线图的基础之上形成的, 它将折线图中折线与自变量坐标轴之间的区域使用颜色或者纹理填充&…...

数据统计与可视化的Dash应用程序

在数据分析和可视化领域&#xff0c;Dash是一个强大的工具&#xff0c;它结合了Python中的数据处理库&#xff08;如pandas&#xff09;和交互式可视化库&#xff08;如Plotly&#xff09;以及Web应用程序开发框架。本文将介绍如何使用Dash创建一个简单的数据统计和可视化应用程…...

解决并发冲突:Java实现MySQL数据锁定策略

在并发环境下&#xff0c;多个线程同时对MySQL数据库进行读写操作可能会导致数据冲突和不一致的问题。为了解决这些并发冲突&#xff0c;我们可以采用数据锁定策略来保证数据的一致性和完整性。下面将介绍如何使用Java实现MySQL数据锁定策略&#xff0c;以及相关的注意事项和最…...

C++——函数重载及底层原理

函数重载的定义 函数重载&#xff1a; 是函数的一种特殊情况&#xff0c;C允许在同一作用域重声明几个功能类似的同名函数&#xff0c;这些同名函数的形参列表&#xff08;参数个数或者类型&#xff0c;类型的顺序&#xff09;不同&#xff0c;常用来处理实现功能类似数据结构…...

Ceph入门到精通-Aws Iam(user,role,group,policy,resource)架构图和快速入门

-- Aws Iam(identity,user,role,group,policy,resource,)架构图和快速入门. 【官网】&#xff1a;Cloud Computing Services - Amazon Web Services (AWS) 应用场景 aws 云服务运维,devops过程中经常涉及各项服务&#xff0c;权限&#xff0c;角色的处理。 为了更好的使用各项…...

【kubernetes】k8s高可用集群搭建(三主三从)

目录 【kubernetes】k8s高可用集群搭建&#xff08;三主三从&#xff09; 一、服务器设置 二、环境配置 1、关闭防火墙 2、关闭selinux 3、关闭swap 4、修改主机名&#xff08;根据主机角色不同&#xff0c;做相应修改&#xff09; 5、主机名映射 6、将桥接的IPv4流量…...

凸优化基础学习——凸集

凸优化基础学习——凸集 文章内容全部来自对Stephen Boyd and Lieven vandenberghe的Convex Optimization的总结归纳。 电子书资源&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1dP5zI6h3BEyGRzSaJHSodg?pwd0000 提取码&#xff1a;0000 基本概念 仿射集合 **…...

oracle 19c环境常见问题汇总

1、rman备份时会消耗这么多临时表空间 参考MOS&#xff1a; RMAN-08132: Warning: Cannot Update Recovery Area ORA-01652: unable to extend temp segment by 64 in tablespace TEMP (Doc ID 2658437.1) Known RMAN Performance Problems (Doc ID 247611.1) 处理办法&…...

django实现悲观锁乐观锁

前期准备 # 线上卖图书-图书表 图书名字&#xff0c;图书价格&#xff0c;库存字段-订单表&#xff1a; 订单id&#xff0c;订单名字# 表准备class Book(models.Model):name models.CharField(max_length32)price models.IntegerField() #count models.SmallIntegerField…...

vector【2】模拟实现(超详解哦)

vector 引言&#xff08;实现概述&#xff09;接口实现详解默认成员函数构造函数析构函数赋值重载 迭代器容量size与capacityreserveresizeempty 元素访问数据修改inserterasepush_back与pop_backswap 模拟实现源码概览总结 引言&#xff08;实现概述&#xff09; 在前面&…...

金融助贷公司怎么获客——大数据获客

2023年已过去大半&#xff0c;整个贷款领域遭遇的现象仍然是拓客难、拓客贵、顾客精确度不高难题。从业者工作压力与日俱增&#xff0c;每日遭遇各种各样考评&#xff0c;因此大家并不是在开发客户便是在开发客户的路上。贷款市场销售艰难变成一个问题&#xff0c;很多贷款营销…...

Java进阶-Oracle(二十一)(2)

&#x1f33b;&#x1f33b; 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型&#xff1a;1.1.2 字符串类型&#xff1a;1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…...

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…...

【BASH】回顾与知识点梳理(二十二)

【BASH】回顾与知识点梳理 二十二 二十二. Linux 账号管理22.1 Linux 的账号与群组使用者标识符&#xff1a; UID 与 GID使用者账号/etc/passwd 文件结构/etc/shadow 文件结构 关于群组&#xff1a; 有效与初始群组、groups, newgrp/etc/group 文件结构有效群组(effective grou…...

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符&#xff08;支持的工具&#xff1a;find&#xff0c;grep&#xff0c;egrep&#xff0c;sed和awk&…...

将SM2根证书预置到chromium中

最近花了很多精力在做chromium的GmSSL适配&#xff0c;协议和算法都已经完成&#xff0c;这篇文章是关于将SM2根证书预置到chromium中 我的开发测试环境是macos12.4&#xff0c;从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成&#xff0c…...

linux安装mysql-8.0.33正确方式及常见问题

目录 获取mysql下载地址链接 解压安装包 复制文件到安装目录 添加用户和用户属组修改权限 创建存储数据的文件夹/usr/local/mysql 初始化安装 修改配置文件 创建日志文件并赋予对应权限 启动成功​编辑 创建软链接 之前安装过mysql&#xff0c;时间比较长忘记安装步骤了今天…...

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…...

机器学习丨1. 机器学习概述

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…...

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时&#xff0c;如果之前已经下载过该库&#xff0c;pip会默认使用缓存来安装库&#xff0c;而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中&#xff0c;具体位置因操作系统和Python版本而异…...

gitee上传一个本地项目到一个空仓库

gitee上传一个本地项目到一个空仓库 引入 比如&#xff0c;你现在本地下载了一个半成品的框架&#xff0c;现在想要把这个本地项目放到gitee的仓库上&#xff0c;这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址&#xff1a;https://gite…...

力扣:63. 不同路径 II(Python3)

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从…...

【C语言】每日一题(多数元素)

多数元素&#xff0c;链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票&#xff1a; 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢&#xff1f; 在一个集合中&#xff0c;如果一个元素…...

后端 .net7 Minimal API 限流中间件(微信小程序无师自通十)

我的微信小程序使用.net7 Minimal API 作为后端&#xff0c;当服务器摆上公网后&#xff0c;可以观察到很多的攻击行为和暴力访问。所以&#xff0c;我需要使用微软的限流中间件部署相应的功能在服务器上 关键字&#xff1a; AddFixedWindowLimiter using Microsoft.AspNetCo…...

背上沉重的书包准备面试之react篇

目录 react特性&#xff1f; react生命周期&#xff1f; state和props区别 react中setState执行机制&#xff1f; 在react类组件形式中&#xff0c;setState第二个参数的作用&#xff1f; react事件机制&#xff1f; react事件绑定方式有哪些&#xff1f; react组件之间…...

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行&#xff0c;如果要检测的形状可以用数学表达式描述&#xff0c;就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…...

W5500-EVB-PICO做UDP Client进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...