okHttp3学习总结

Android 网络请求(一):OkHttp3 面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。 阅读详情

OkHttp3

okHttp3 是一个 Android的基于Http的网络开源框架,是由 square 公司开发。

现在网上比较推荐的两个 Android 网络开源框架,一个是 okHttp,另一个是 Retrofit
,而 Retrofit 是根据 okHttp封装的框架。所以关于Android网络部分,okHttp是必须要学习的一个知识。

[官网地址] (https://github.com/square/okhttp)

项目中引用 okHttp3 只需要在 app 的 build.gradle 中引用 compile ‘com.squareup.okhttp3:okhttp:3.6.0’ 即可。

[慕课网洪洋大神的okHttp视频]
(http://www.imooc.com/learn/764)
[参考的简书文章]
(http://www.jianshu.com/p/964bb1b2d345)
[参考的优快云文章]
(http://blog.youkuaiyun.com/itachi85/article/details/51190687)

1.okHttp3的基本用法
首先,不管是 Get 请求还是 Post 请求,同步或者异步,okHttp3的请求总体分为三步:

  1. 构造出一个okHttp3下的Request对象
  2. 通过这个Request对象,构造出一个Call对象
  3. 调用这个call对象的同步或者异步方法执行网络访问

示例如下:

    //构造出一个Request对象,address是访问的服务器地址,当前示例是get方式访问
    Request request = new Request.Builder().url(address).get().build();
    //通过上面的request对象,构造出一个Call对象,sOkHttpClient为全局的OkHttpClient对象
    Call call = sOkHttpClient.newCall(request);
    //call执行enqueue(异步)或者execute(同步),callback为异步执行时的回调对象
    call.enqueue(callback);

2.okHttp3下的Get请求方式

 /**
 * Get请求方法
 * @param view
 */
public void doGet(View view){
    String address = baseUrl + "login?username=hblolj&password=123456";
    HttpUtils.sendOkHttpRequestByGet(address, new Callback() {
        //请求失败的回调
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }
        //请求成功的回调
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //拿到服务器返回的数据
            final String result = response.body().string();
            Log.i(TAG, "onResponse: " + result);
            //因为是enqueue异步执行,所以只有在主线程中才可以更新UI
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(result);
                }
            });
        }
    });
}

/**
 * HttpUtils中的Get请求方法
 * @param address  get方式的请求地址
 * @param callback 回调对象
 */
public static void sendOkHttpRequestByGet(String address , Callback callback){
    Request request = new Request.Builder().url(address).get().build();
    Call call = sOkHttpClient.newCall(request);
    call.enqueue(callback);
}

3.okHttp3下的Post请求方式(键值对型)

Tips:post请求默认的类型是:application/x-www-form-urlencoded

  //在OkHttp3的源码中FormBody 的源码    
  private static final MediaType CONTENT_TYPE =
  MediaType.parse("application/x-www-form-urlencoded");

根据 MediaType 的类型,post选择对上传的数据是否进行编码处理。如果为 multipart/form-data 类型表示上传的是文件,则不用进行编码处理。

/**
 * Post请求方法
 * @param view
 */
public void doPost(View view){
    //登录接口
    String address = baseUrl + "login";
    Map<String, String> map = new HashMap<>();
    map.put("username", "hblolj");
    map.put("password", "123456");
    HttpUtils.sendOkHttpRequestByPost(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String result = response.body().string();
            Log.i(TAG, "onResponse: " + result);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(result);
                }
            });
        }
    }, map);
}

/**
 * HttpUtils中的post请求方法
 * @param address  post请求的地址
 * @param callback 回调对象
 * @param maps     post请求的参数
 */
public static void sendOkHttpRequestByPost(String address, Callback callback, Map<String, String> maps){
    //根据参数中的maps拼装出RequestBody,用来保存参数,默认的MediaType
    RequestBody requestBody = new FormBody.Builder()
            .add("username", maps.get("username"))
            .add("password", maps.get("password"))
            .build();
    //将请求地址与请求参数设置给Request
    Request request = new Request.Builder().url(address).post(requestBody).build();
    //构造Call对象
    Call call = sOkHttpClient.newCall(request);
    //异步执行网络访问
    call.enqueue(callback);
}

4.okHttp3下的Post请求方式(String型)

/**
 * Post请求上传字符串
 * @param view
 */
public void doPostString(View view){
    String address = baseUrl + "postString";
    HttpUtils.sendOkHttpRequestByPostString(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String result = response.body().string();
            Log.i(TAG, "onResponse: " + result);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(result);
                }
            });
        }
    }, "我是通过PostString传递的字符内容");
}

/**
 * Post上传字符串方法
 * @param address  服务器地址
 * @param callback 回调对象
 * @param value    上传的字符串
 */
public static void sendOkHttpRequestByPostString(String address, Callback callback, String value){
    //相对于键值对类型,这里指定了MediaType
    RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), value);
    //构造Request
    Request request = new Request.Builder().url(address).post(requestBody).build();
    //构造Call
    Call call = sOkHttpClient.newCall(request);
    //异步执行
    call.enqueue(callback);
}

5.okHttp3下的Post请求方式(File型)

/**
 * Post请求上传文件
 * @param view
 */
public void doPostFile(View view){
    String address = baseUrl + "postFile";
    //从内存卡获取文件
    File file = new File(Environment.getExternalStorageDirectory(), "shareimg.png");
    if (!file.exists()){
        Log.i(TAG, "文件不存在");
        tv_result.setText("文件不存在!");
        return;
    }
    HttpUtils.sendOkHttpRequestByPostFile(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String result = response.body().string();
            Log.i(TAG, "onResponse: " + result);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(result);
                }
            });
        }
    }, file);
}

/**
 * Post方法上传文件
 * @param address   完整的请求地址
 * @param callback  回调对象
 * @param file      上传的文件对象
 */
public static void sendOkHttpRequestByPostFile(String address, Callback callback, File file){
    //指定了MediaType为application/octet-stream,并且传入File生成requestBody
    RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
    //构造Request
    Request request = new Request.Builder().url(address).post(requestBody).build();
    //构造Call
    Call call = sOkHttpClient.newCall(request);
    //异步执行
    call.enqueue(callback);
}

6.okHttp3下的文件上传

/**
 * okHttp3下的文件上传
 * @param view
 */
public void doUpload(View view){
    String address = baseUrl + "uploadFile";
    File file = new File(Environment.getExternalStorageDirectory(), "tagPicture.jpg");
    if (!file.exists()){
        Log.i(TAG, "文件不存在");
        tv_result.setText("文件不存在!");
        return;
    }
    HttpUtils.sendOkHttpRequestByUpload(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            final String result = response.body().string();
            Log.i(TAG, "onResponse: " + result);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(result);
                }
            });
        }
    }, file);
}

/**
 * okHttp3下的文件时上传
 * @param address  访问的地址
 * @param callback 回调对象
 * @param file     上传的文件
 */
public static void sendOkHttpRequestByUpload(String address, Callback callback, File file){
    //构造MultipartBody(复合Body)
    MultipartBody multipartBody = new MultipartBody.Builder()
            //配置上传的类型
            .setType(MultipartBody.FORM)
            //上传的普通键值对
            .addFormDataPart("username", "hblolj")
            .addFormDataPart("password", "123456")
            //参数对应为name, fileName, reuqestBody
            .addFormDataPart("picture", "一张照片.jpg",
                //构造文件类型RequestBody
                RequestBody.create(MediaType.parse("application/octet-stream"), file))
            .build();
    //构造Request
    Request request = new Request.Builder().url(address).post(multipartBody).build();
    //构造Call
    Call call = sOkHttpClient.newCall(request);
    //异步执行
    call.enqueue(callback);
}

7.okHttp3下的文件下载

/**
 * okhttp3下的文件下载
 * @param view
 */
public void doDownloadFile(View view){
    //下载地址
    String address = baseUrl + "files/picture.jpg";
    HttpUtils.sendOkHttpRequestByDownloadFile(address, new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.i(TAG, "onFailure: " + e.getMessage());
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //拿到服务器下载文件的输入流
            InputStream is = response.body().byteStream();
            //本地新建文件
            File file = new File(Environment.getExternalStorageDirectory(), "一张照片6666.jpg");
            //拿到新建文件的输出流
            FileOutputStream fout = new FileOutputStream(file);
            //模板代码,将下载文件的输入流写到新建文件
            int len = 0;
            byte[] buf = new byte[128];
            while((len = is.read(buf)) != -1){
                fout.write(buf, 0, len);
            }
            fout.flush();
            fout.close();
            is.close();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText("下载成功");
                }
            });
        }
    });
}

/**
 * okhttp3下的文件下载
 * 找到下载地址,就是普通的Get访问
 * @param address  下载地址
 * @param callback 回调对象
 */
public static void sendOkHttpRequestByDownloadFile(String address, Callback callback){
    Request request = new Request.Builder().url(address).get().build();

    Call call = sOkHttpClient.newCall(request);
    call.enqueue(callback);
}

8.okHttp3下的Session保持与缓存

/**
 * 全局的okHttpClient
 */
private static OkHttpClient sOkHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {

        private Map<String, List<Cookie>> cookieStore = new HashMap<String, List<Cookie>>();

        @Override
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
            //根据请求的host保存cookies到内存,达到session的保存
            Log.d("HttpUtils", "host: " + url.host());
            cookieStore.put(url.host(), cookies);
        }

        @Override
        public List<Cookie> loadForRequest(HttpUrl url) {
            List<Cookie> cookies = cookieStore.get(url.host());
            return cookies!=null?cookies : new ArrayList<Cookie>();
        }
    })
        //设置连接超时时间
        .connectTimeout(1500, TimeUnit.MILLISECONDS)
        .readTimeout(2000, TimeUnit.MILLISECONDS)
        .writeTimeout(2000, TimeUnit.MILLISECONDS)
        //设置保存缓存的文件以及大小限制
        .cache(new Cache(file , 10*1024*1024))
        .build();   

9.okHttp3的框架封装

参考开始的推荐文章

基本使用——OkHttp3详细使用教程 概述 OkHttp现在应该算是最火的Http第三方库,Retrofit底层也是使用OkHttp,网上很多教程都写的不错,但是有些我认为重要的知识,大多一笔带过,所以我决定写一篇入门文章 OkHttp官网地址:http://square.github.io/okhttp/ OkHttp GitHub地址:https://github.com/square/okhttp 出现背景 网络... 阅读详情

相关推荐

OKHttp3源码分析——学习笔记

文章目录1. HttpClient与HttpUrlConnection的区别2. OKHttp源码分析使用步骤:dispatcher任务调度器,Request请求RealCallAsyncCall3. OKHttp架构分析1. 异步请求线程池, Dispather2. 连接池清理线程池- ConnectionPool3. 缓存整理线程池 DisLruCache4. Http2异步事务线程池, ht...

Sincerity_的博客 1380

OKHttp3的使用和详解

OKHttp3的使用和详解

QG 2万+

okhttp3完整版JAR

官方完整版okhttp3 maven com.squareup.okhttp3 okhttp (insert latest version)

OkHttp3简介和使用详解

1 简介 OKHttp是一个当前主流的网络请求的开源框架 Square公司开发,用于替代HttpUrlConnection和Apache HttpClient Android4.4开始,google已经开始将源码中的HttpURLConnection替换为OkHttp Android6.0里已移除HttpClient 优点 (版本一) 支持HTTP2/SPDY(SPDY是Google开发...

jiaonizuoren的博客 3万+

矩阵LED和矩阵按键

先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环

qq_46615634的博客 5797

基于COMSOL电弧动态仿真模型优化:高收敛性可修改吹弧方案解析

在多物理场耦合分析中,电弧动态仿真历来是数值稳定性的难点:温度从室温跃升至数万开尔文,电导率随温度呈数量级跳变,流动、传热与电磁场相互牵制,极易引发求解器不收敛或初始值不一致等问题。如何构建高收敛性的数值模型,成为开关设备灭弧性能优化的重要技术基础。通过合理的几何简化、全耦合求解器配置、辅助扫描初始化策略以及参数化建模手段,可以实现对吹弧方案的灵活调整与批量寻优,从而系统性评估气流速度、喷口形状、触头间距等关键因素对熄弧性能的影响。这类仿真方法广泛应用于断路器、接触器等高压电器产品研发,为灭弧室结构设计提供

weixin_29758911的博客 350

OkHttp3源码学习经历

真是好漫长的一场旅途啊,这应该算是我第一次读这么多的源码,经验欠缺,借鉴了很多大神和师兄们的文章和资料,也有用到AI,我知道这样一行一行读源码可能不是一个很好的方式,但是我也必须这样去做,我自己的方式,期待后面能改进吧!!!与大家共勉!

Why_So_Sad_Guys的博客 1753

当我们谈论Unidbg时我们在谈什么

文章目录一、前言二、使用Unidbg的工作量是什么三、补环境补的是什么3.1 运行环境缺失3.2 上下文缺失四、Unidbg 不是所有情况下最优的解决方案五、Unidbg在大多数情况下是好的方案六、Unidbg和风控无关七、尾声 一、前言 这是一篇漫谈Unidbg的文章,我对Unidbg的使用和理解都还很浅,日后会更新或修改看法,欢迎大佬指点,也期待同侪讨论。 二、使用Unidbg的工作量是什么 我们常规使用Frida + IDA的动静态分析中,工作可能是这样的 找线索→Frida Hook验证→验证成功继

lilac的博客 5789

OKHttp3学习笔记-环境准备

代码撸起来。 之前使用HttpURLConnect或者XUtils或者OKHttp都是以一种不求甚解的态度,纯作为工具使用的,也就是满足了当时的开发需求,就结束了。作为初级程序员这没有问题,但是要想让自己升段,就必须尽可能多的深入下去。 这次学习将主要关注在Http协议部分,以及OKHttp3的文件上传。为了能够学习起来更能直观,自己搭了一个本地服务器。 本地服务器运行环境:Wampserve

狂暴棕熊的博客 488

嵌入式学习(29)-ASM330LHH驱动程序

ASM330LHH是一种系统级封装器件,具有3D数字加速度计和3D数字陀螺仪,扩展温度范围上限为+105 °C,适用于汽车非安全领域的应用。ASM330LHH 的满量程加速范围为±2 g、±4 g、±8 g 和 ±16 g,角速度范围扩展至 ±125 dps、±250 dps、±500 dps、±1000 dps、± 2000 dps 和 ±4000 dps,适合各种汽车应用。

剑藏锋的博客 1177

机器学习之支持向量机SVM及代码示例

一、线性可分SVMSVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法。对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分。(超平面:一维中是一个点;二维中是一条线;三维中是一个面……)在上面的多个超平面中,它们都可以成功将样本集划分两边,但哪一个超平面更好?一般来说,当样本点离超平面越近,样本的标签为某类型的概率应该为0.5左右,确信度比较低,而样本点离超平面越远

cxmscb的博客 5万+

Day6 快速学习OkHttp3的九大用法

效果图:点此进入目录:[干货] 十天 教你从创意到上线APP一、OkHttp3的基本用法OkHttp3是Java和Android都能用,Android还有一个著名网络库叫Volley,那个只有Android能用。导入OkHttp3在gradle中添加依赖: compile 'com.squareup.okhttp3:okhttp:3.4.2' compile 'com.squareup

WillFlow的博客 1243

13、HTML 表格创建与样式设置全攻略

本文全面介绍了HTML表格的创建与样式设置方法,涵盖表格行列添加、边框控制、行和列分组(thead、tbody、tfoot、colgroup)、宽度与高度设置、内边距与间距调整,以及表格对齐方式。同时提供了最佳实践建议、常见问题解决方案及综合示例代码,帮助开发者构建结构清晰、样式美观且兼容性强的HTML表格。

blue的专栏 97

Android网络框架OKhttp3学习笔记

OKhttp3是一个非常强大的Android网络框架,它是由Square公司开发并开源的,很大Android开发者都会使用到,所以我也要来学学。 服务器 为了方便测试,我们需要一个后台服务器的的应用,下面是一个Java Web的Servlet,它的功能是接收客户端发来的登录数据,判断密码是否正确,并返回结果(JSON格式) import javax.servlet.ServletExce

夜雨飘零 833

RK3588 hdmirx 调试(含v4l2工具,edid编辑)

RK3588 Buildroot系统中调试HDMI-RX的过程,包括抓图、修改EDID数据、编辑EDID等操作。首先,通过logcat和寄存器信息查询HDMI-RX的状态,使用v4l2-ctl工具进行测试和修改EDID。

501846585_QQAndroid_java 2686

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OkHttp3学习

OkHttp3学习之旅: 1、OkHttp3会从很多常见的连接问题中自动恢复,    如果你的服务器配置了多个IP地址,当第一个IP连接失败时,会自动尝试下一个IP    OKHttp3使用前需在build.gradle里面配置以下内容:    compile 'com.squareup.okhttp3:okhttp:3.9.0'    compile 'com.squareup.oki

u010015933的博客 416

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

okhttp3框架学习

这篇文章是参考网上一些优秀文章学习okhttp3的笔记,属于入门级,理解还不是很透彻。 http://www.cnblogs.com/qlky/p/7246331.html 根据Okhttp的使用步骤分析 步骤1.OkHttpClient okHttpClient = new OkHttpClient(); 创建OkHttpClient对象。OkHttpClient为网络请求的一个中心,它...

weixin_44380128的博客 320

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入学习Okhttp3完美封装

由于项目时间赶 ,优快云收藏功能不见了 ,为了节约时间写博客收藏博客 Okhttp3封装

artshuo 1025

关于OkHttp3的学习

网络请求 okhttp3

_oO微胖是最好的耶耶耶耶的博客 1221

OkHttp3 学习

最近在看安卓网络相关的东西,学习记录一下 跟最下方参考的文章比起来有点班门弄斧的感觉,推荐直接看参考文章 核心 RealInterceptorChain一条责任链 这个设计的比较巧妙,通过拦截器执行再执行的过程,使用方不需要关心在哪一部分被消费掉,只需要关注结果即可 下面分析这两个方法 copy 复制一份,生成新的 internal fun copy( index: Int = this.index, exchange: Exchange? = this.exchange, requ

cy41的博客 229

使用Okhttp3访问网络 Okhttp使用学习笔记(一)

简单使用Okhttp3访问网络 Okhttp使用学习笔记(一)关于OKHttp第一步,引用Okhttp第二步,修改MainActivity.java第三步,修改activity_main.xml布局文件最后一步,添加网络权限 关于OKHttp 详细可以看GitHup的项目主页地址:https://github.com/square/okhttp 。 运行结果图: 第一步,引用Okhttp 首先在...

Tobey_r1的博客 1918

okhttp3学习与使用

okhttp3学习与使用介绍简单使用功能 介绍 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽,OkHttp是一个高效且十分火热的HTTP客户端。 简单使用 在postman里测试好请求后,直接可以选择复制,新版的postman语法就是okhttp3(老版的是okhttp2) 功能 OkHttpClient类: OkHttp客户端类,用来构建请求发起类Call,设置超时,设置缓存,设置拦截器等 OkHttpClient,是OkHttp的客户端类,该类使用

qq_42023813的博客 1052

OKHttp3学习

转载 Okhttp3基本使用基本使用——OkHttp3详细使用教程 一、简介 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。 OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接 连接池减少,请求连接复用以提高效率 透明的GZIP压...

weixin_30856965的博客 107

okhttp3.0学习

这几天学习了下okhttp的使用,公司的网络请求一直是使用的xutils。学习完okhttp基本的用法之后,想想觉得应该记录一下,加深下印象,也方便以后自己回头再来看。水平低,所以如果有同学看到这篇文章,想使用okhttp的话,建议自己使用原生的okhttp,或者使用github上的一些大神提供的封装类库。 一,okhttp使用步骤:我使用的okhttp的版本是3.6的 1. 首先要给自己的工程添

LH0102的专栏 610

OKHttp3学习记录

一、概述 okhttp作为时下Android开发最火热的网络请求框架,学习下还是很有必要的,记录学习过程方便以后查询,guthub地址https://github.com/square/okhttp。在Android studio中添加依赖: compile ‘com.squareup.okhttp3:okhttp:3.5.0’ 添加网络权限 <uses-permission andr

heiiapk的博客 297
上一篇: SpringMvc+MyBatis+Spring+Maven整合遇到的问题总结
下一篇: Java8学习总结
Earth_Programer
博客等级 码龄11年 18粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值