Android 使用Retrofit网络框架

【实现用户注册】 Android——实现用户注册并且跳转到注册界面 java类LoginActivity——代码 Activity类activity_login.xml——代码 阅读详情

Retrofit网络框架的学习:

Retrofit底层封装OkHttp与Gson等框架,且为RESTful编程风格,必须写接口进行查询

代码部分:

注意点:baseUrl必须以 ‘/’ 结束,否则会抛出异常

.addConverterFactory(GsonConverterFactory.create())
将获取到的JSON数据转换为GSON数据,进而自动封装到实体类中


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 Retrofit builder =new Retrofit.Builder()
 				/*必须以  '/'  结束*/
                .baseUrl("http://apis.juhe.cn/simpleWeather/") 
                /*将返回的数据转换为Gson*/
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiService apiService = builder.create(ApiService.class);
        HashMap<String, String> map = new HashMap<>();
        map.put("city","北京");
        map.put("key","88888888");
        apiService.getWeather(map)
                .enqueue(new Callback<Weather>() {
                    @Override
                    public void onResponse(Call<Weather> call, Response<Weather> response) {
                        try {
                            text.setText(response.body().toString());
                            Log.e("onSuccess", response.body().toString() + "");
                        } catch (Exception e) {
                            Log.e("onResponse", "获取数据错误:" + e.getMessage() );
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onFailure(Call<Weather> call, Throwable t) {
                        Log.e("onResponse", "错误"  + t.getMessage());

                    }
                });
                }

使用GsonFormat自动生成Bean类
package com.gsonweathertest.pojo;


import java.util.List;

public class Weather {

    @Override
    public String toString() {
        return "Weather{" +
                "reason='" + reason + '\'' +
                ", result=" + result +
                ", error_code=" + error_code +
                '}';
    }

    /**
     * reason : 查询成功
     * result : {"city":"苏州","realtime":{"temperature":"4","humidity":"82","info":"阴","wid":"02","direct":"西北风","power":"3级","aqi":"80"},"future":[{"date":"2019-02-22","temperature":"1/7℃","weather":"小雨转多云","wid":{"day":"07","night":"01"},"direct":"北风转西北风"},{"date":"2019-02-23","temperature":"2/11℃","weather":"多云转阴","wid":{"day":"01","night":"02"},"direct":"北风转东北风"},{"date":"2019-02-24","temperature":"6/12℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东北风转北风"},{"date":"2019-02-25","temperature":"5/12℃","weather":"小雨转多云","wid":{"day":"07","night":"01"},"direct":"东北风"},{"date":"2019-02-26","temperature":"5/11℃","weather":"多云转小雨","wid":{"day":"01","night":"07"},"direct":"东北风"}]}
     * error_code : 0
     */

    private String reason;
    private ResultBean result;
    private int error_code;

    public String getReason() {
        return reason;
    }

    public void setReason(String reason) {
        this.reason = reason;
    }

    public ResultBean getResult() {
        return result;
    }

    public void setResult(ResultBean result) {
        this.result = result;
    }

    public int getError_code() {
        return error_code;
    }

    public void setError_code(int error_code) {
        this.error_code = error_code;
    }

    public static class ResultBean {
        @Override
        public String toString() {
            return "ResultBean{" +
                    "city='" + city + '\'' +
                    ", realtime=" + realtime +
                    ", future=" + future +
                    '}';
        }

        /**
         * city : 苏州
         * realtime : {"temperature":"4","humidity":"82","info":"阴","wid":"02","direct":"西北风","power":"3级","aqi":"80"}
         * future : [{"date":"2019-02-22","temperature":"1/7℃","weather":"小雨转多云","wid":{"day":"07","night":"01"},"direct":"北风转西北风"},{"date":"2019-02-23","temperature":"2/11℃","weather":"多云转阴","wid":{"day":"01","night":"02"},"direct":"北风转东北风"},{"date":"2019-02-24","temperature":"6/12℃","weather":"多云","wid":{"day":"01","night":"01"},"direct":"东北风转北风"},{"date":"2019-02-25","temperature":"5/12℃","weather":"小雨转多云","wid":{"day":"07","night":"01"},"direct":"东北风"},{"date":"2019-02-26","temperature":"5/11℃","weather":"多云转小雨","wid":{"day":"01","night":"07"},"direct":"东北风"}]
         */

        private String city;
        private RealtimeBean realtime;
        private List<FutureBean> future;

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }

        public RealtimeBean getRealtime() {
            return realtime;
        }

        public void setRealtime(RealtimeBean realtime) {
            this.realtime = realtime;
        }

        public List<FutureBean> getFuture() {
            return future;
        }

        public void setFuture(List<FutureBean> future) {
            this.future = future;
        }

        public static class RealtimeBean {
            /**
             * temperature : 4
             * humidity : 82
             * info : 阴
             * wid : 02
             * direct : 西北风
             * power : 3级
             * aqi : 80
             */

            private String temperature;
            private String humidity;
            private String info;
            private String wid;
            private String direct;
            private String power;
            private String aqi;

            public String getTemperature() {
                return temperature;
            }

            public void setTemperature(String temperature) {
                this.temperature = temperature;
            }

            public String getHumidity() {
                return humidity;
            }

            public void setHumidity(String humidity) {
                this.humidity = humidity;
            }

            public String getInfo() {
                return info;
            }

            public void setInfo(String info) {
                this.info = info;
            }

            public String getWid() {
                return wid;
            }

            public void setWid(String wid) {
                this.wid = wid;
            }

            public String getDirect() {
                return direct;
            }

            public void setDirect(String direct) {
                this.direct = direct;
            }

            public String getPower() {
                return power;
            }

            public void setPower(String power) {
                this.power = power;
            }

            public String getAqi() {
                return aqi;
            }

            public void setAqi(String aqi) {
                this.aqi = aqi;
            }
        }

        public static class FutureBean {
            @Override
            public String toString() {
                return "FutureBean{" +
                        "date='" + date + '\'' +
                        ", temperature='" + temperature + '\'' +
                        ", weather='" + weather + '\'' +
                        ", wid=" + wid +
                        ", direct='" + direct + '\'' +
                        '}';
            }

            /**
             * date : 2019-02-22
             * temperature : 1/7℃
             * weather : 小雨转多云
             * wid : {"day":"07","night":"01"}
             * direct : 北风转西北风
             */

            private String date;
            private String temperature;
            private String weather;
            private WidBean wid;
            private String direct;

            public String getDate() {
                return date;
            }

            public void setDate(String date) {
                this.date = date;
            }

            public String getTemperature() {
                return temperature;
            }

            public void setTemperature(String temperature) {
                this.temperature = temperature;
            }

            public String getWeather() {
                return weather;
            }

            public void setWeather(String weather) {
                this.weather = weather;
            }

            public WidBean getWid() {
                return wid;
            }

            public void setWid(WidBean wid) {
                this.wid = wid;
            }

            public String getDirect() {
                return direct;
            }

            public void setDirect(String direct) {
                this.direct = direct;
            }

            public static class WidBean {
                @Override
                public String toString() {
                    return "WidBean{" +
                            "day='" + day + '\'' +
                            ", night='" + night + '\'' +
                            '}';
                }

                /**
                 * day : 07
                 * night : 01
                 */

                private String day;
                private String night;

                public String getDay() {
                    return day;
                }

                public void setDay(String day) {
                    this.day = day;
                }

                public String getNight() {
                    return night;
                }

                public void setNight(String night) {
                    this.night = night;
                }
            }
        }
    }
}


接口类

注意点:注解POST或GET等必须写value属性,没有则填 ‘.’ 或 ‘/’ 且POST请求必须加上 @FormUrlEncoded 注解 ,否则会抛出异常

public interface ApiService {
    @FormUrlEncoded  //post请求必须加上
    @POST("query") //没有数据就填 . 或者 /
    Call<Weather> getWeather(@FieldMap Map<String,String> map);

}

更多接口案例

/*如果想使用url上的参数时,请求参数必须使用@Path注解来获取。*/
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

/*还可以添加查询参数。*/
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

/*对于复杂的查询参数组合,可以使用Map。*/
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

/*@Field注解将每一个请求参数都存放至请求体中*/
/*对于复杂的查询参数组合,可以使用映射。可以通过@Body注释指定一个对象作为HTTP请求体使用。*/
@POST("users/new")
Call<User> createUser(@Body User user);

/*当@ formurlencodes出现在方法上时,将发送表单编码的数据。每个键-值对都用@Field注释,其中包含名称和提供值的对象。*/
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

注解名注意及作用
@Body作用于方法的参数, 使用该注解定义的参数不可为null
@Url作用于方法参数,用于添加请求的接口地址
@Field作用于方法的参数, 用于发送一个表单请求用String.valueOf()把参数值转换为String,然后进行URL编码,当参数值为null值时,会自动忽略
@FieldMap作用于方法的参数, 用于发送一个表单请求,map中每一项的键和值都不能为空,否则抛出IllegalArgumentException异常
@FormUrlEncoded用于修饰Field注解和FieldMap注解,使用该注解,表示请求正文将使用表单网址编码。字段应该声明为参数,并用@Field注释或FieldMap注释。使用FormUrlEncoded注解的请求将具”application / x-www-form-urlencoded” MIME类型。字段名称和值将先进行UTF-8进行编码,再进行URI编码.
@GET用于发送一个get请求,GET注解一般必须添加相对路径或绝对路径或者全路径,如果不想在GET注解后添加请求路径,则可以在方法的第一个参数中用@Url注解添加请求路径
@Path作用于方法的参数,URL路径段中替换指定的参数值。使用String.valueOf()和URL编码将值转换为字符串,使用该注解定义的参数的值不可为空,参数值默认使用URL编码
@POST用于发送一个POST请求,POST注解一般必须添加相对路径或绝对路径或者全路径,如果不想在POST注解后添加请求路径,则可以在方法的第一个参数中用@Url注解添加请求路径
@Query作用于方法的参数,用于添加查询参数,即请求参数,参数值通过String.valueOf()转换为String并进行URL编码,使用该注解定义的参数,参数值可以为空,为空时,忽略该值
@QueryMap作用于方法的参数,以map的形式添加查询参数,即请求参数,参数的键和值都通过String.valueOf()转换为String格式,map的键和值默认进行URL编码,map中每一项的键和值都不能为空

成功获取数据
在这里插入图片描述

Android 网络框架之Retrofit源码解析 如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。欢迎大家一起交流讨论啊~《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!ofit巧妙的使用了动态代理在调用接口的方法之前,统一的去解析处理Header和URL等操作;这样就不用每次在新增一个请求的方法,就去写一遍这个解析的逻辑;那么接下来我们来看看Retrofit的怎么解析这些接口的;6.2、Retrofit是怎么使用动态代理的? 阅读详情

相关推荐

安卓常用网络请求框架XUtils、OkHttp、Volley、Retrofit

1.xutils 此框架庞大而周全,这个框架可以网络请求,同时可以图片加载,又可以数据存储,又可以 View 注解,使用这种框架很方便,这样会使得你整个项目对它依赖性太强,万一以后这个库不维护了,或者中间某个模块出问题了,这个影响非常大,所以在项目开发时,一般会更喜欢选择专注某一领域的框架。 使用案例: RequestParams params = new RequestParams("http:...

qq_35448522的博客 850

安卓开发笔记

一、安卓工程构建和第一 APP 运行 1.构建容易,包名不能包含中文 2.模拟器一般用MuMu模拟器,eclipse和MuMu模拟器建立连接adb connect 127.0.0.1:7555 3.连接失败要重启adb adb kill-server adb start-server 4.运行,工程名字上右键,run as android appclication 二、安卓的工程目录文件夹介绍 src: 存放 java 代码的,有包,有文件gen: 存放自动生成的文件,关心是R.java,程序...

weixin_48856218的博客 3019

【Android】网络编程之OKHTTP与Retrofit框架

fastmock可以让你在没有后端程序的情况下能真实地在线模拟ajax请求,你可以用fatmock实现项目初期纯前端的效果演示,也可以用fastmock实现开发中的数据模拟从而实现前后端分离。同样的在okhttp中我们需要切换线程到主线程来设置数据到控件上,说明okhttp框架只帮我们解决了构建子线程的问题,线程切换还是需要自己实现。Retrofit框架看上去已经很完美了,但是因为它帮我们完成了数据解析,我们无法捕获数据解析是否成功,所以当数据解析失败时通过。通过接口和注解来描述我们的网络请求,然后通过。

jixuczy的博客 877

Android活动中onCreate参数Bundle savedInstanceState的作用

当我们使用Android Stdio的活动自动向导自动生成活动时,在活动中Android Stdio会自动为我们生成这样一段代码。 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } 这段方法会在活动被系统创建后被调用。而这个活动的参数Bu

little_White12的博客 4141

Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码

找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。多练。(视频优势是互动感强,容易集中注意力)你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。//创建缓存@Override。

m0_61369275的博客 1407

Retrofit、OkHttp和Gson的Android网络框架封装指南

创建网络请求接口是使用Retrofit库时的首要步骤。Retrofit将HTTP API映射为Java接口,通过这些接口能够轻松地发起网络请求。首先,定义一个接口,然后为每一个网络请求创建一个方法。方法名可以随意命名,但建议用直观的动词表示即将执行的操作,比如。在方法声明中,你可以指定请求类型、参数、路径和返回类型。以下是一个基本的GET请求的示例:在此例中,listRepos方法表示从 GitHub API 的用户仓库获取数据。其中,@GET。

weixin_35752122的博客 478

浸入式状态栏

应该说是常用半浸入式(状态类透明) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //浸入式状态栏 View decorView = getWindow().getDecorView();

shuai_ge_feng的博客 504

Xiaojie雷达之路---毫米波雷达基础知识---角度估计

本篇文章主要介绍毫米波雷达的基础知识中的角度估计,对于本篇文章主要回答5个问题 1.在雷达的前方,如何估计前方一个物体的角度 2.角度测量的准确性 3.如何测量多个物体的角度 4.雷达可测的角度的视场最大值为多少 5.角度分辨率取决于什么因素 文章目录估计雷达前面一个物体的角度角度测量的准确性雷达的最大角视场测量雷达前方多个距离和速度相同的物体角度分辨率角度估计的流程 估计雷达前面一个物体的角度 估计一个物体的角度,最少需要两根接收天线 发射天线发送一个chirp,经过物体发射后信号,信号分别被第一根天

XiaoJie的博客 1万+

AndroidStudio学习之RecyclerView(二)

可参考视频(有完整的讲解):天哥在奔跑 实现水平滚动功能 与RecyclerView(一)的实现基本一样 public class HorRecyclerViewActivity extends AppCompatActivity { private RecyclerView mRvHor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst

annimeme的博客 267

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

MediaPipeUnityPlugin(最新版)摇摆拳人脸识别

不忘初心 方得始终 2978

ESP32-P4开发板实战:从零配置VSCode环境到点亮MIPI-DSI屏幕(避坑指南)

本文详细介绍了ESP32-P4开发板在VSCode环境下的配置流程,包括SDK安装、idf_component.yml依赖管理,以及MIPI-DSI屏幕驱动的实现方法。通过实战指南帮助开发者避开常见配置陷阱,快速完成从环境搭建到屏幕点亮的全流程,适用于物联网和嵌入式开发场景。

pp12345的博客 739

Android 目前最流行的网络请求框架【Retrofit】

Retrofit`可以节省老一套网络请求写那么多代码的冗杂 为开发者提供了相对简单的请求方案 作为安卓目前最流行的网络请求框架,确实名不虚传.

datian1234的博客 1414

把 ST03 的历史数据留得更久:ABAP Workload 统计保留期设置、原理与落地避坑指南

SAP ST03性能数据保留期配置指南 ST03/ST03N是SAP系统性能分析的核心工具,但默认数据保留期通常较短(3个月左右),难以满足跨季度对比、年度规划等需求。本文详细解析了ST03数据保留期的配置方法及注意事项: 数据存储机制:性能数据存储在监控库中,通过定期重组作业清理过期数据 配置路径:7.0+系统在"Workload Collector Database→Reorganization→Control"中按Profile分别设置 关键限制:保留期最大值建议不超过99,否则可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 217

Android网络框架Retrofit全面解析

Retrofit作为Android平台主流的网络请求框架,通过注解系统和模块化设计简化了HTTP请求处理。摘要:Retrofit基于OkHttp实现,支持类型安全的API定义、自动数据转换和线程管理。核心包括注解系统(@GET/@POST等)、转换器(Gson/Jackson)和适配器(RxJava)。使用步骤涵盖依赖配置、接口定义、实例创建和请求处理。高级功能支持文件传输、协程/RxJava集成,以及自定义转换器。Retrofit以简洁的API和强大的扩展性,成为Android开发中高效处理网络请求的首选

weixin_44078411的博客 716

爬虫法律风险与合规边界

爬虫技术的法律边界正在快速收紧。从2017年上海晟品案开启爬虫入刑先河,到2025年Cloudflare区块链溯源技术将违规行为与企业主体永久绑定,合规已从"可选项"变为"必选项"。技术团队需要建立三层防御体系法律合规层:法律适用判定、授权管理、合同审查、隐私政策;技术控制层:访问控制、数据加密、匿名化、审计日志、监控告警;组织管理层:DPO任命、培训体系、应急响应、合规审计、绩效考核。

从事移动开发八年,csdn博客专家,阿里云特邀专家,华为云云享专家,高级网络信息安全工程师,大数据工程师(高级),python技术开发(高级),HarmonyOS 应用开发者高级认证,现在某学校任教。 1160

Scale-up,scale-out技术概述

本文系统分析了Scale-up与Scale-out两种扩展技术在现代计算中的应用与发展。Scale-up通过增强单节点性能,适用于高耦合任务,而Scale-out通过横向扩展节点,实现高可用性和无限扩展。在芯片层面,Chiplet技术推动Scale-up发展;在数据中心层面,二者协同工作构建强大集群。光模块在长距离高带宽传输中发挥关键作用。文章对比了NVIDIA、AMD和Broadcom三家公司的技术路线,指出NVIDIA采用封闭生态,AMD选择开放标准,Broadcom则主导底层连接技术。未来发展方向将聚

元直的博客 1445

Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码)

OkHttp+Retrofit+RxJava搭建网络访问框架前言正文总结 前言   在实际开发APP中,网络访问是必不可少的,最开始访问网络是使用HttpURLConnection、而后面有了一些框架比如Volley、OkHttp、Retrofit等。那么你可能看到最多的是OkHttp,因为它很出名,Google也推荐你使用此框架进行网络访问。你可能会说Retrofit,Retrofit其实就是对OkHttp的二次封装。还有RxJava,这个又是用来干嘛的呢?为什么要将三者组合起来,组合有什么优势吗?带

晨曦 4536

数字图像处理 基于matlab、opencv计算图像的梯度方向和梯度幅值

图像可以被视为标量场(即二维函数)。通过微分将标量场转换为矢量场。梯度是一个向量,描述了在x或y方向上移动时,图像变化的速度。我们使用导数来回答这样的问题,图像梯度的大小告诉图像变化的速度,而梯度的方向告诉图像变化最快的方向。因为梯度有方向和大小,所以将这些信息编码为向量是很自然的。该向量的长度提供了梯度的大小,而其方向提供了梯度方向。因为梯度在每个位置可能不同,所以我们在每个图像位置用不同的向量来表示它。

学以致用 知行合一 3201

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

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

程序病毒小队的博客 1824

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android Retrofit网络请求框架

转载自monkey01的博客[https://www.jianshu.com/p/8d857bf1f4f8] 1 Retrofit介绍 Retrofit是square开源的网络Restful请求框架,底层是基于okhttp的,使用起来有点像feign,写后台的朋友应该会比较熟悉,看了Retrofit的源码会发现实现原理和feign一样,都是基于Java的动态代理来实现的,开发者只需要定义接口就可以...

tinysakura的博客 973

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

2024年安卓最全Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架(1),移动端页面开发框架图

首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

2301_82244158的博客 821

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 网络请求框架retrofit

Retrofit是现在比较流行的网络请求框架,可以理解为okhttp的加强版,底层封装了Okhttp。准确来说,Retrofit是一个RESTful的http网络请求框架的封装。因为网络请求工作本质上是由okhttp来完成,而Retrofit负责网络请求接口的封装。

特立独行的博客 2040

『Android基础入门』网络编程之OKHTTP与Retrofit框架

网络请求-》java-》OKHTTP数据解析-》java解析-》GSON配合插件解析概述 - OkHttp (square.github.io)HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行 HTTP 会使内容加载速度更快并节省带宽。OkHttp 是一个默认高效的 HTTP 客户端:OkHttp 适用于 Android 5.0+(API 级别 21+)和 Java 8+。框架官网地址 添加网络请求权限添加依赖 由此我们可以知道okhttp框架相较于传统的网络请求的优势:打印测

一个专注于客户端开发的技术er,不定期更新Android,Flutter,HormonyOS等方向的使用心得和感悟 1701
上一篇: Android中BaseAdapter对getView优化的理解
下一篇: Android中使用OkHttp的五种请求方式及注意事项
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这次最后一次熬夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值