Android开发之路—网络请求篇Retrofit2.0的使用

Android---Retrofit实现网络请求:Kotlin版 Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为相应的 HTTP请求,Retrofit 是适用于 Android 和 Java 的类型安全 HTTP 客户端。通过Retrofit,我们可以轻松发起网络请求,还能将服务器返回的数据转换为所需的格式,如 JSON。 阅读详情

参考文章:
https://blog.youkuaiyun.com/m0_37796683/article/details/90702095

欢迎关注我的个人公众号
在这里插入图片描述

一、前言

最近着实有点烦躁,疫情的影响,整个生活和工作都感觉到压抑。今天打算写一下Retrofit网络请求框架,之后的几篇打算把所有的网络框架都写一下,算是对网络请求框架的一个总结。

1、Retrofit是什么

Retrofit是一个RESTful的HTTP网络请求框架的封装,Retrofit的本质是通过注解的形式封装请求参数、Header、URL、返回值等信息。底层的请求工作时交给OkHttp完成的,Retrofit是本质上是对网络请求接口的封装。但是这种高度封装带来的后果就是扩展性差,解析的数据都是统一的converter,如果服务器不能给出统一的API形式,那么很难处理。但是这种缺点我们可以通过自定义converter来处理。

二、Retrofit注解类型

我们前面说过Retrofit是通过注解的方式对接口的统一封装,然后交给okhttp来完成网络请求。
Retrofit对网络请求接口的定义如下:

public interface APIInterface {
    //获取无重复ID
    @GET("tools/no_repeat_id/long")
    Call<ResponseBody> getLongId();
    }

这里APIInterface是所有网络请求的封装的Interface,getLongId为我们定义的请求方法名,注解@GET为get请求后面的参数代表请求的部分url,返回值类型为Call泛型为ResonseBody;
Retrofit的注解类型共有三种:

  1. 网络请求方法注解;
  2. 标记类注解;
  3. 网络请求参数注解

1、网络请求方法注解

有的博客还将@HEADER和@HEADERS单独划分出来作为请求头注解也是可以的。

注解名称说明
@GET采用Get方法发送网络请求
@POST采用Post方法发送网络请求
@PUT采用Put方法发送网络请求
@DELETE采用Delete方法发送网络请求
@PATCH该请求是对put请求的补充,用于更新局部资源
@HEADhead请求
@OPTIONSoptions请求
@HTTP通过注解,可以替换以上所有的注解,它拥有三个属性:method、path、hasBody

2、标记类注解

注解名称说明
@FromUrlEncoded发送编码表单数据请求,每个键值对需要使用@Filed注解
@Multipart表示发送form-encoded的数据(适用于有文件上传的场景)
@Streaming表示响应用字节流的形式返回,如果没有使用注解,默认会把数据全部载入到内存中,之后获取数据也是从内存中读取。

3、网络请求参数注解

注解名称说明
@Headers添加固定的请求头,作用于方法
@Header添加不固定的请求头,作用于方法的参数
@Body非表单请求体如:json
@Filed、@FiledMapPost表单请求字段,需要配合@FromUrlEncoded使用。体现在请求体上
@Part、@PartMap文件上传,表单字段
@Query、@QueryMapGet的请求参数字段,体现在URL上。
@Path用于URL中的占位符
@Url设置请求路径

以上的请求注解我们暂时仅做了解一下,接下来结合具体的例子能帮助我们理解。

三、Retrofit的使用方法

1、添加依赖

implementation ‘com.squareup.retrofit2:retrofit:2.7.2’

2、添加网络权限

3、创建用于描述网络接口的类

public interface APIInterface {
    //获取无重复ID
    @GET("tools/no_repeat_id/long")
    Call<ResponseBody> getLongId();
    
    }

4、创建Retrofit的实例

 mRetrofit=new Retrofit.Builder()
                .baseUrl(Configure.URL_OPEN)
               //支持自定义数据解析
                .addConverterFactory(GsonConverterFactory.create())
                .build();

说明:

  1. Retrofit的实例通过new Retrofit.Builder()创建,设置baseUrl,接口地址包含两个部分,一部分就是baseUrl,另一部分是APIInterface中定义的@GET注解接口方法名tools/no_repeat_id/long;这两部分就是一个完整的请求路径。
  2. 添加数据解析器Gson,如果不添加默认接受的是字符串类型。
  3. 注意baseUrl的地址必须以“/”结尾,否则会抛异常

设置Gson数据解析需要配置以下依赖:

 implementation 'com.squareup.retrofit2:converter-gson:2.8.1'

5、创建网络接口请求示例

Call<ResponseBody>callGetID=mRetrofit.create(APIInterface.class)
                            .getLongId();

6、完成网络请求(同步、异步)

6.1、发送同步请求:

 new Thread(new Runnable() {
            @Override
            public void run() {
        try {
            Response<ResponseBody>mResponse=callGetID.execute();
            Log.d(TAG,mResponse.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

同步请求调用execute()方法;

6.2、发送异步请求:

callGetID.getLongId().enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                Log.d(TAG,response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Log.d(TAG,t.toString());
        }
    });

异步请求执行enqueue方法。

我们简单的介绍了如何使用@Get无参注解进行同步和异步的请求,前面我们也介绍了Retrofit中的注解类型,接下来我们具体看一下请求注解的使用。

7、请求注解的使用

7.1、Get请求注解的使用

get请求的无参请求,上面的例子我们已经给出了

7.1.1、无参请求
public interface APIInterface {
    //获取无重复ID
    @GET("tools/no_repeat_id/long")
    Call<ResponseBody> getLongId();
    
    }

说明:

  1. @GET(),get请求方法注解,括号内代表url中的路径和请求方法,注意不能以“/”结尾;否则会报错,这一点要与baseUrl区分;
  2. getLongId()是我们定义的请求方法,返回值类型为Call,入参为无参。
7.1.2、有参请求

Get有参请求注解中,分为参数个数固定的和参数不固定的,我们统一来看

 @GET("jokes/list")
 Call<ResponseBody> getJokes(@Query("page") String pageNum);

说明:
@Query是get请求中的请求参数注解,括号内的page就是我们的请求参数,它会拼接到@Get请求url的后面(拼接形式:baseurl+jokes/list?page=1),String 代表请求参数类型,pageNum请求参数的数值。

 @GET("music/order/song/list")
 Call<ResponseBody> getNewsList(@QueryMap Map<String,Object> map);

说明:@QueryMap是get请求参数不固定的注解,相当于多个@Query,请求方法接收一个Map,这个Map是用来对请求参数的封装。

7.2、 Post请求注解的使用

7.2.1、Post请求无参注解的使用

post请求无参注解和get请求无参注解类似,只不过将@GET注解改成@POST注解,示例代码如下:

//获取无重复ID
    @Post("tools/no_repeat_id/long")
    Call<ResponseBody> getLongId();
7.2.2、Post请求有参注解的使用(表单数据)
@FormUrlEncoded
@POST("user/login")
Call<ResponseBody> postLogin(@Field("username") String name,@Field("password") String pwd);

有参的post请求,针对form表单请求需要添加注解@FormUrlEncoded,表示表单请求的键值对进行了url编码,此外每个键的字段需要添加@Field注解。
这个是针对参数固定请求的写法,如果参数不固定,采用下面的写法。

@FormUrlEncoded
@POST("user/login")
Call<ResponseBody> postLogin(@FieldMap Map<String,String> map);

@FieldMap与@Field的作用一致,可以用于添加多个不确定的参数,类似@QueryMap;

7.2.3、Post请求有参注解非标单数据的使用

对于非表单数据的请求,通过@Body注解传递自定义的数据类型给服务器,表单注解@Body不能用于表单或者支持文件上传的表单的编码,即不能与@FormUrlEncoded和@Multipart注解同时使用

@POST("user/login")
Call<ResponseBody> postRegisterAccountBody(@Body RequestBody body)

使用方法:

FormBody.Builder builder = new FormBody.Builder();
builder.addEncoded("username","xuchangqing");
builder.addEncoded("password","Xcq12345");
builder.addEncoded("repassword","Xcq12345");

builder.build()作为RequestBody中body参数的使用。

7.3、请求头注解的使用

有时我们需要在网络请求中加入请求头,Retrofit提供了两种添加请求头的方式@Header添加不固定的请求头,@Headers添加固定的请求头。

 @GET("user/login")
 Call<ResponseBody> getHeaderData(@Header("token") String token);
 
 @Headers({"phone-type:android", "version:1.1.1"})
 @GET("user/login")
 Call<ResponseBody> getHeadersData();

说明:@Header作用于参数,@Headers作用于方法。

7.4、文件上传注解的使用

7.4.1、文件和参数混合上传注解的使用
@Multipart
@POST("user/picture")
Call<ResponseBody> getPartData(@Part("name") RequestBody name, @Part MultipartBody.Part file);

说明:@Multipart是一个支持文件上传的表单,但是需要配合@Part和@PartMap使用,@Part 支持三种类型的数据:一种是RequestBody类型,一种是MultipartBody.Part类型,另一种是任意数据类型;这里的网络接口是文件和请求参数混合上传的方式,第一个参数为请求参数,第二个参数为文件。

 //上传文字
MediaType mediaType = MediaType.parse("text/plain");
RequestBody fileName = RequestBody.create(mediaType, "xuchangqing");
//上传图片
File file = new File("");
MediaType mediaTypeImg = MediaType.parse("image/png");
RequestBody mFile = RequestBody.create(mediaTypeImg, file);

MultipartBody.Part muiltPart = MultipartBody.Part.createFormData("file", file.getName(), mFile);

7.4.2、单文件上传注解的使用
@Multipart
@POST("user/picture")
Call<ResponseBody> getPartData @Part MultipartBody.Part file);

//上传图片
File file = new File("");
MediaType mediaTypeImg = MediaType.parse("image/png");
RequestBody mFile = RequestBody.create(mediaTypeImg, file);

MultipartBody.Part muiltPart = MultipartBody.Part.createFormData("file", file.getName(), mFile);
7.4.3、多文件上传注解的使用
 @Multipart
 @POST("user/followers")
 Call<ResponseBody> getPartMapData(@PartMap Map<String, MultipartBody.Part> map);

注意:
在使用文件上传的过程中,如果我们采用这种写法

@Multipart
@POST("user/picture")
Call<ResponseBody> getPartData @Part("file") RequestBody file);

服务端识别不出这个是一个文件的,会把它当成一个参数;
另外MultipartBody.Part作为参数类型的话,@Part一定是无参的,否则会报错。

7.5、其他请求注解的使用

7.5.1、@Body注解的使用

前面我们说过@Body注解用于非表单形式的请求,如json,HashMap,自定义实体类等。它的用法:

 @POST("user/login")
 Call<UserBean> postUserLogin(@Body UserBean userBean);

我们传入的是一个实体类,当然我们要在retrofit中添加适配器GsonConverterFactory,这时UserBean会转成json发送到服务器中。注意:@Body注解不能用于表单或者支持文件上传的表单的编码,即不能与@FormUrlEncoded和@Multipart注解同时使用,否则会报错。

7.5.2、@HTTP注解的使用
@HTTP(method = "POST", path = "user/login", hasBody = false)
Call<ResponseBody> getHttpData();

@HTTP它拥有三个属性:method、path、hasBody,注意method的请求方法名要注意大小写,path代表请求路径,hasBody代表是否包含请求体。
@HTTP注解可以替代Get\Post\Delete请求;

7.5.3、@Path注解的使用

@Path注解用于Url中的占位符{},所有在网址中的参数,通过{}占位符来标记;

@GET("user/{id}")
Call<ResponseBody> getUserId(@Query("name")String userName, @Path("id")String id);
7.5.4、@Url注解的使用
@FormUrlEncoded
@POST
Call<ResponseBody> postRegisterAccountMap(@Url String url, @FieldMap Map<String, String> map);

注意如果有@Url注解时,@POST中的参数必须省略,否则报错。

7.5.5、@Streaming注解的使用

表示响应体的数据用流的方式返回,使用于返回数据比较大,该注解在下载大文件时特别有用

四、HTTPS请求方式

Https的请求为了保证数据在传输过程中更加的安全,采用SSL证书验证身份的一种请求方式。htpps认证分为单项认证和双项认证的方式;

4.1、单项认证

单项认证就是校验服务端是否具有合法性,这需要在客户端配置服务端的证书;客户端请求服务器的证书与客户端证书比对是否一致,如果不一致则认为是非法的服务端;

4.2、双项认证

双项认证主要是应用在安全等级要求比较高的领域比如银行金融等。双项认证不仅要求客户端校验服务端也同时要求服务端校验客户端。服务端校验客户端,需要客户端将证书传送给服务端进行校验。

4.3、注意

我们使用Https请求并没有配置SSL证书,为什么是成功的呢?这是因为我们Android系统中配置了CA的根证书或者是我们对Https请求没有进行证书校验,但是这么做假设不合法的服务器也配置了CA的证书,客户端也是能够校验通过的。对于客户端对https请求没有进行证书校验,有两种通用的做法:

  • 创建一个不验证证书链的证书信任管理器
 final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            @Override
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[0];
            }
        }};
  • 使用自定义SSLSocketFactory
private void onHttps(OkHttpClient.Builder builder) {
    try {
        builder.sslSocketFactory(getSSLSocketFactory()).hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

五、与Rxjava结合使用

与Rxjava的结合使用方式比较简单,如果对Rxjava的使用方法还不熟悉的同学可以看一下我上篇的Rxjva使用。

5.1、配置依赖

使用Rxjava需要我们配置添加依赖:

implementation 'com.squareup.retrofit2:adapter-rxjava:2.8.1'

代码中添加依赖:
addCallAdapterFactory(RxJavaCallAdapterFactory.create())

mRetrofit=new Retrofit.Builder()
        .baseUrl(Configure.URL_OPEN)
       //支持自定义数据解析
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

5.2、使用方法

Retrofit与Rxjava的结合使用方法, 需要我们在定义的接口中的返回值类型变更为Observable即可。
具体使用方法如下:

  1. 接口定义:
@POST("user/login")
@FormUrlEncoded
Observable<ResponseBody> postLoginObserve(@Field("username") String name, @Field("password") String pwd);

  1. 代码实现
Retrofit.Builder retrofitBuilder = new Retrofit.Builder();
    Retrofit retrofit = retrofitBuilder.baseUrl(Configure.URL_Android)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
    retrofit.create(APIInterface.class)
            .postLoginObserve("xuchangqing","Xcq12345")
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<ResponseBody>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onNext(ResponseBody responseBody) {
                    try {
                        Log.d(TAG,"Observer_____+"+responseBody.string());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

六、问题

java.lang.IllegalArgumentException: baseUrl must end in /

解决办法:baseurl必须以"/"结尾;

java.lang.IllegalArgumentException: @Url cannot be used with @POST URL (parameter #1)
解决办法:@Post或者@Get的注解必须保证是不带路径的。不能写成@Post(“xx/xx”)或者@Get(“xx”)这种形式。

Observable 泛型不支持

解决办法:不要导入java.util的包,导入import rx.Observable;

引入rxjava无法识别AndroidSchedulers.maithread();
注意导包问题,可能Observable所在的包和RxAndroid所在的包名不一致;

七、 总结

这篇文章算是对Retrofit的基本使用做了简单的介绍,但是讲起如何进行封装,有时间打算说一下框架的封装及源码的实现。先说这么多,算是个总结吧。

Android 使用Retrofit2.0 + OKHttp 实现 HTTP协议请求 记得之前要想实现http协议自己封装会比较繁琐,后来有了OKHttp,另http请求更加轻便。 今天主要来说下Retrofit2.0的用法,由于本人之前几年用的as3 air,也是最近才开始重新回来写Android,对于Retrofit的使用经验为0,上手就是看的2.0,个人觉得Retrofit2.0用起来相比OKHttp更加方便代码也很容易理解,但是网上关于Retrofit2.0的资料很少,于 阅读详情

相关推荐

【我的Android进阶之旅】使用Retrofit进行Post请求报错: @Field parameters can only be used with form encoding.

一、问题描述 今天随手写一个post请求的时候,报错了,如下所示: 09-28 11:11:28.155 10547-10547/com.xtc.watch E/Fatal: {CrashHandler.saveAndPrintLog-58} java.lang.IllegalStateException: Exception thrown on Scheduler.Worker th...

字节卷动 8582

@Url cannot be used with @GET URL (parameter #1)

如果需要使用@Url,请从@GET注释中删除网址,将网址中的部分网址添加到url参数中。 @GET Observable<String> gToken(@Url String url, @Query("usertype") int userType); 如果运行不生效,建议把app卸载重新运行一下。 ...

Long的博客 3289

使用RxJava+Retrofit+OkHttp打造Android网络请求框架

在RxJava中,线程调度器(Scheduler)负责控制Observable在哪个线程上执行操作,以及Subscriber在哪个线程上接收通知。这允许开发者将操作指定到合适的线程,例如,网络请求和数据库操作等耗时任务应放在后台线程执行,而更新UI的操作则需要在主线程(UI线程)上进行。RxJava提供了多种内置的调度器,如Scheduler等。每个调度器都与特定类型的线程池相关联,以优化资源的使用和执行效率。Retrofit支持自定义转换器和适配器来处理特定格式的数据。

weixin_35756130的博客 874

Retrofit动态设置baseUrl和@url的使用

一. Retrofit动态设置baseUrl有四种方式: 配置多个retrofit对象:即不同的 BaseUrl 使用不同的 Retrofit 对象来创建 ApiService 进行请求,这样只要新增一个不同的 BaseUrl ,那就需要重新创建一个新的 Retrofit 对象。 缺点:代码冗余,浪费资源,ApiService太多,不好管理。 @Get , @Post 全路径:这些标注到每个接口方法上的注解不仅可以传相对路径,还可以传全路径,这样我们就可以做到不同的接口使用不同的 BaseUrl ,使用全

liuxiaopang520的博客 1万+

掌握Retrofit网络请求的全面实践指南

本文还有配套的精品资源,点击获取 简介:Retrofit是Square公司开发的Android网络请求库,它支持注解方式简化代码和多种HTTP请求。本范例详述了如何使用Retrofit进行GET、POST请求、文件上传和下载操作。通过引入Retrofit库、定义API接口、创建Retrofit实例和服务接口调用,以及处理回调响应,本课程将帮助开发者深入理解和应用Retrof...

weixin_35592186的博客 1576

手把手教你用Boot-Repair快速修复Ubuntu启动分区缺失(附详细命令行步骤)

本文详细介绍了如何使用Boot-Repair工具快速修复Ubuntu启动分区缺失问题,包括诊断、应急准备、自动修复和手动命令操作。通过grub rescue模式下的关键命令和Boot-Repair的图形界面操作,帮助用户高效解决启动分区故障,确保系统恢复正常运行。

weixin_29229989的博客 563

retrofit 官方动态Url请求

开发中经常会遇到一个app中会有多个请求url,这样就涉及到不同的baseurl;解决办法 官方通过@Url传递全量url进行请求,如下 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build() public interface GitHubService {...

倒骑驴走着瞧的博客 3066

智慧楼宇解决方案-全套大合集

智慧楼宇解决方案,楼宇能耗-环境-设备统一管控解决方案。

byte58的博客 2592

Retrofit 2 动态URL

问题使用Retrofit2一般都是针对于一baseURL,其它接口都是拼接不同的参数如get/photo,search?name=xiaohong&&sex=female,这样的形式。但是一些请求此时又要访问不同的url只能重新生成一个Retrofit2实例,实质上还有一种形式去处理,就是使用@url注解。解决方案public interface UserService { @GET

小小程序员 1万+

值得苦练的100道Python经典练手题(全网最全,附详细答案,建议收藏)

这100道Python练习题涵盖了从基础语法到高级算法、从数据库操作到Web开发的各个方面,是备考数据库系统工程师的绝佳素材。建议按照章节顺序逐一练习,遇到难点可反复钻研,真正掌握每一道题背后的知识点。通过这些练习,不仅能提升Python编程能力,还能加深对数据库系统原理的理解,为考试和实际工作打下坚实基础。

yue_yun_的博客 9393

SMPLify-x-master | 复现记录

由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。

qq_44916003的博客 5100

Android Retrofit2.0使用详解

前言 首先是我接触Retrofit的时候还是2017年培训的时候接触过的,当时觉得非常的高大上,而且用着真的非常复杂,不如OkHttp那样爽,当一年后去了一家公司之后发现用的是Retrofit,看代码的时候一脸懵逼,所幸的是公司给了提前熟悉代码的时间,然后科普了几天的Retrofit和Rxjava,今天先记录一下Retrofit2.0的使用。 介绍 Retrofit是什么? Retrofit其...

张晓辉的博客 1万+

四舵轮底盘运动学模型(源码)(四轮四独立转向)二

舵轮4转向活动范围 x 轴正半轴,x轴正方向为0弧度,左正右负, -M_PI/2 < 转向范围 < M_PI/2;移动底盘的正前方为x方向,左侧为y轴方向(遵循右手坐标系,右手大拇指指向天空为z轴方向,食指与中指垂直,食指指向小车正前方为x轴,中指指向为移动底盘y轴方向)转向:逆时针旋转角速度w为正,顺时针旋转角速度w为负。(遵循右手螺旋法则,右手握拳大拇指指向天空为旋转z轴方向,拳垂直于地面,4指方向即底盘转动的正方向)左前轮为1号轮,右前轮为2号轮,左后轮为3号轮,右后轮为4号轮。

苏凯的博客 528

【Android 进阶】Retrofit2 目前最优雅的网络请求框架

身为Geek的我们,面对不断更新换代的技术是不是有点感到迷茫呢?其实只要掌握正确的学习方法,新的技术也就不畏惧了。 福利来了 推荐一位大牛【人称:面哥】呕心沥血的一篇经验分享: 程序员之路-学习经验总结分享 正是面哥的鞭策,我决定开始看英文的技术文档,学习新技术也是直接看官网的技术文档,本篇文章就是我在Retrofit2的官网看完英文文档Retrofit之后写的翻译版本。希望对英文不是很好的

Veyron_wu 9313

YOLOv8实战教程:从模型训练到改进的全流程指南

回顾这段YOLOv8的实战历程,从最初的模型训练到后来的各种改进尝试,我深刻体会到目标检测技术的魅力与挑战。YOLOv8作为一款优秀的框架,不仅易用性强,而且具备很强的可扩展性,让我能在其基础上不断创新。未来,我计划在以下几个方向继续探索:一是将YOLOv8与多模态技术结合,尝试实现图像与文本的联合目标检测;二是深入研究自监督学习在YOLOv8中的应用,减少对标注数据的依赖;三是探索YOLOv8在更广泛场景的部署,如机器人、自动驾驶等。

LXY_LOVE36的博客 279

【实战】小红书笔记爬虫终极指南:模拟滑动加载,抓取图文(2026最新版)

小红书作为国内最大的生活方式分享社区,每天产生海量的图文笔记。对于数据分析、市场调研、竞品分析等需求,爬取小红书公开笔记成为一项常见任务。然而,小红书的反爬机制日益升级——接口加密、动态Token、滑动验证、设备指纹……本文将深入剖析小红书Web端和App端的爬取技术,手把手教你用Python实现模拟滑动加载、自动抓取图文笔记的完整爬虫系统。全文包含大量代码、原理分析和排坑经验,适合有一定爬虫基础的读者进阶学习。目录前言一、小红书反爬机制概览二、环境准备2.1 Python环境2.2 浏览器驱动。

2201_76125261的博客 766

Android 使用RxJava+Retrofit 2.0合并网络请求

在开发验证码的功能时,要求验证code的同时判断这个是不是服务码(万能码),这个就需要同时去请求两个接口,只要有一个功能就算成功。 @Override public void checkConfirmCode(String deviceId, String code, OnAPIListener listener) { Map map = new Has

疾风的博客 6511

SpringBoot 系列教程(二):SpringBoot使用Devtools实现热部署

1.devtools   spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。 2.项目搭建   本文是采用IDEA搭建的Spring Boot应用,通过spring-boot-devtools配置,可以支持修改java文件会自动重启程序,一些资源无需触发重启,...

Thinkingcao的专栏 1215

安卓网络请求详解:Retrofit + OkHttp 高效通信方案

Retrofit 的核心思想是 “用接口定义请求”,通过注解描述 HTTP 方法、URL、参数等信息,再由 Retrofit 动态生成实现类,最终发起请求。"data": {"id": 1,"name": "张三","age": 25定义对应的实体类:// 基础响应类(通用结构)// getter 和 setter// 用户信息类// getter 和 setterHTTP 方法@GET@POST@PUT@DELETE等。URL 路径@Path(路径参数)、@Query。

2401_89387076的博客 1745

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android Retrofit2.0 网络请求固定入参

前言 Android开发中进行网络请求时,我们很多时候会有有一些固定入参。比如: 写在请求头的token令牌。 一些第三方平台接口,请求时要求必须携带的平台key。 这些固定入参每次请求都写在请求方法中的话,势必会非常的烦,如果能统一封装一下岂不美哉? 在Retrofit2.0中我们可以通过Interceptor拦截器实现,然后在Okhttp3使用Builder添加Interceptor。 示...

DeMonnnnnn 1000

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android网络篇—Retrofit网络请求框架详解

介绍配置大于编码 (Retrofit:http请求库 支持java与android)改进地方:以配置代替编码 冠以 Retrofit 这个名字的这个家伙,应该是某某某的 『Plus』 版本了。 Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是 Retrofit 来完成的。Retrofit 2.0 开始

程序病毒小队的博客 1824

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Retrofit 2

Retrofit 是一个 restful 的 HTTP 网络请求框架的封装。网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析相对其他开源库而言代码简洁使用更加方便.

2401_89678804的博客 2100

Android 使用kotlin Retrofit2 + Dagger2完成网络请求跟依赖注入组合使用

Android 使用kotlin Retrofit2 + Dagger2完成网络请求跟依赖注入组合使用

qq_44023485的博客 1695

Android开发实战班 -网络编程 - Retrofit 网络请求 + OkHttp 使用详解

网络编程的作用网络编程用于实现应用与服务器之间的数据交互,例如获取数据、提交数据、更新数据等。常见的网络请求类型有 GET, POST, PUT, DELETE 等。网络编程的挑战异步操作: 网络请求是异步的,需要处理线程切换和回调。错误处理: 需要处理网络错误、超时、数据解析错误等。安全性: 需要处理 HTTPS、证书验证、加密传输等。性能优化: 需要优化网络请求的性能,例如缓存、重试机制等。Retrofit 的历史与发展。

知道者 1700

Android 网络框架 Retrofit2.0介绍、使用和封装

前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟。网络框架中的佼佼者Volley也不再那么光鲜,取而代之的是 Retrofit 和 okHttp。 感觉很像 OnePiece 中白胡子的离去象征着时代的变革,新时代的开始,多弗的垮台象征着七武海制度的取缔一样,不会使用Retrofit + okH

baiiu 1万+

在 Android 中使用 Retrofit 的简单 GET 请求

网络是移动开发的关键因素。大多数(如果不是所有)移动应用程序都在某种程度上包含网络。应用程序正在发送或接收信息。最初,开发人员在主线程中处理网络.这使得应用程序的用户友好性降低,因为屏幕会“冻结”。 在 Honeycomb 版本发布后,主线程上的网络停止了。谷歌随后在 2013 年开发了 Volley。 介绍 你可以在这里阅读我关于 Volley 的文章。 Volley 提供了更好的东西:它更快、提供更好的功能、更简单的语法等。不过,在网络方面仍有增长空间。 Square 推出了 Retrofi.

allway2的博客 3464
上一篇: Android开发之路--Rxjava2.0的使用
下一篇: Android事件分发的注意问题
FlyRabbit_1
博客等级 码龄10年 4粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值