Square 之 Retrofit 使用详解

spring-cloud-square源码速读(retrofit ,java线程池面试 前言 本系列的目的是明明白白、彻彻底底的搞定日期/时间处理的几乎所有case。上篇文章铺设所有涉及到的概念解释,例如GMT、UTC、夏令时、时间戳等等,若你还没看过,不仅强烈建议而是强制建议你前往用花5分钟看一下,因为日期时间处理较为特殊,实战必须基于对概念的了解,否则很可能依旧雾里看花。 说明:日期/时间的处理是日常开发非常常见的老大难,究其原因就是对日期时间的相关概念、应用场景不熟悉,所以不要忽视它 本文落地实操,二者相辅相成,缺一不可。本文内容较多,文字较长,预计超2w字,旨在全面的彻底帮你搞定J 阅读详情

Android 网络请求框架

如有问题请先参考 一下链接

http://square.github.io/retrofit/

1)  OkHttp  :回调方法 在子线程中执行
2)  Retrofit

使用 okHttp

okHttp 在android 中使用相对较少,异步接口回调处,方法不在ui线程中执行。
而在retrofit 的底层中已经引进了 okHttp ,okHttp 与andorid 并没有什么关系,亦可在 java 中使用

使用方式 代码如下 内含 pull 数据解析 :
 package com.bitch.okhttpdemo;

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.Toast;

    import org.xmlpull.v1.XmlPullParser;
    import org.xmlpull.v1.XmlPullParserException;
    import org.xmlpull.v1.XmlPullParserFactory;

    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    import okhttp3.Call;
    import okhttp3.Callback;
    import okhttp3.MediaType;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.RequestBody;
    import okhttp3.Response;
    import okhttp3.ResponseBody;

    public class MainActivity extends AppCompatActivity implements Callback {

        private static final String TAG = MainActivity.class.getSimpleName();
        private Call call;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            OkHttpClient client = new OkHttpClient();
            RequestBody requestBody = RequestBody.create(MediaType.parse("text/html"), "?mod=rss");
            Request request = new Request.Builder().url("http://www.inexus.co/portal.php").post(requestBody).build();
            call = client.newCall(request);
            //同步请求
    //        Response response = call.execute();
            //异步请求
            call.enqueue(this);
        }

        @Override
        protected void onDestroy() {
            super.onDestroy();
            call.cancel();
        }

        /**
         * 失败回调,是在非UI线程中执行
         * @param call
         * @param e
         */
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        /**
         * 成功回调,是在非UI线程中执行
         * @param call
         * @param response
         * @throws IOException
         */
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.d(TAG, "onResponse: " + Thread.currentThread().getId());
            Log.d(TAG, "onResponse: " + Thread.currentThread().getName());
            if (response.code() == 200) {
                ResponseBody body = response.body();
                //字节数组
    //            body.bytes();
                //字符集为UTF-8的字符串
    //            String string = body.string();
                try {
                    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                    XmlPullParser parser = factory.newPullParser();
                    parser.setInput(body.charStream());
                    List<RssItem> list = new ArrayList<>();
                    while (parser.next() != XmlPullParser.END_DOCUMENT){
                        switch (parser.getEventType()){
                            case XmlPullParser.START_TAG:
                                switch (parser.getName()){
                                    case "item":
                                        list.add(new RssItem());
                                        break;
                                    case "title":
                                        if (!list.isEmpty()) {
                                            list.get(list.size() - 1).setTitle(parser.nextText());
                                        }
                                        break;
                                        case "link":
                                        if (!list.isEmpty()) {
                                            list.get(list.size() - 1).setLink(parser.nextText());
                                        }
                                        break;
                                    case "category":
                                        if (!list.isEmpty()) {
                                            list.get(list.size() - 1).setCategory(parser.nextText());
                                        }
                                        break;
                                    case "author":
                                        if (!list.isEmpty()) {
                                            list.get(list.size() - 1).setAuthor(parser.nextText());
                                        }
                                        break;

                                }
                                break;
                        }
                    }
                    Log.d(TAG, "onResponse: ");
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                }
            }
        }
    }







使用Retrofix :25 minutes 普通数据 json 数据xml delete 都可

简介: retrofit 底层使用,okHttp

使用 接口,Retrofit开启 实体类注解:

如果解析数据 用到 gson 的话 可以直接导入 gosn 的转换器

http header 头请求数据

 @Headers("")       // 部分网络请求需要设置 Headers 在此设置
 @GET("portal.php")  get中数据 为文件地址 
 Call<String> getXML(@Query("mod") String mod);// 方法参数
 @Query 

注意

如果使用到 Post 并且使用到 String 的时候 需要 添加
@FormUrlEncoded
1) 新建interface 内容格式如下:

 @GET("portal.php") // post  请求的话 直接在这改 就行 delete copy  请求都可以做
 @Headers({"apikey:123"})  //可以加http 头请求数据
 Call<String> getXML(@Query("mod") String mod);// 这种方式 就会 key value 的形式拼接下去




2) 调用处  : 
    a) 构建 Retrofit 对象

    b)   // 动态实现接口的一种方式 把接口实例化出来一个对象
        Service service = retrofit.create(Service.class);
c)开启异步
    // call = service.getXML("rss");
    // 建立实体类的时候 注意 实体类最好加上注解
     package com.example.liyang.retrofituse;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.ArrayList;

import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Converter;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends AppCompatActivity implements Callback<String> {

    private Call<String> call;
    private ListView lv;
    private ItemAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.main_list);
        adapter = new ItemAdapter(this,new ArrayList<Item>());
        lv.setAdapter(adapter);



        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.tngou.net")

// create 的参数为 gosn 的实体类  没有特殊要求的话 直接使用 无参的就可以
                // 有要求的话 重写下就行
                .addConverterFactory(GsonConverterFactory.create())
 // Response 转换成为 type 类型
//@Override
// public Converter<ResponseBody, ?> 

//responseBodyConverter(Type type, Annotation[] annotations, 

//Retrofit retrofit) {

// if (type.equals(String.class)) {

//      return  new Converter<ResponseBody, String>() {

//  //把传入的这个 ResponseBody 转换成我们需要的数据
// 这里指的是 String 实体类的话 再将String 解析即可
//                                @Override
//                                public String convert(ResponseBody value) throws IOException {
//
 //注意这个地方是  string 不是 toStirng
//                                    return value.string();
//                                }
//                            };
//                        }
//
 // 其他的使用 父类的方法 即可 其实 父类的方法 返回的是一个  空

// return super.responseBodyConverter(type, annotations,             retrofit);
//                    }
//                })

                .build();

        // 动态实现接口的一种方式 把接口实例化出来一个对象
        Service service = retrofit.create(Service.class);

        // 调用里边的方法
       // call = service.getXML("rss");
        // 建立实体类 注意 实体类最好加上注解
        Call<Tngou> json = service.getJson();

        json.enqueue(new Callback<Tngou>() {
            @Override
            public void onResponse(Call<Tngou> call, Response<Tngou> response) {
                Tngou body = response.body();
                Log.d("MMM", "onResponse: "+body);

            }

            @Override
            public void onFailure(Call<Tngou> call, Throwable t) {

            }
        });

        // 同步方法 不可以在主线程中执行  使用很少
//        try {
//            call.execute();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        // 异步请求方法  这几把单词啥意思
      //  call.enqueue(this);


    }

    /**
     * 在ui 线程中执行
     * @param call
     * @param response
     */
    @Override
    public void onResponse(Call<String> call, Response<String> response) {

        // 返回值是 String  因为我们之前设置的是 String 其实它可以是任意类型
        String body = response.body();
        Log.d("MMM", "onResponse: "+body);
    }


    // 在页面不展示的时候 同事把这个停下来
    @Override
    protected void onDestroy() {
        super.onDestroy();
        call.cancel();
    }

    /**
     * 在ui线程 中执行
     * @param call
     * @param t
     */
    @Override
    public void onFailure(Call<String> call, Throwable t) {

    }
}
3) 实体类 解析数据时 最好添加注解 如下: 

@SerializedName("id")
private long id;
@SerializedName("title")
private String title;

使用retrofit xml 转换器解析

        主流两种数据格式,json与 xml 数据,json 市场 > xml ,当多数论坛依旧使用xml数据,比如我访问网页时的 rss 格式 (很多博客论坛都提供了 rss 格式,需先得到其rss文件的地址) http://bbs.goodprogrammer.org/forum.php?mod=rss&fid=43 

    对rss,xml 文件做解析 规整数据 之后重新 发布 ,使用 retrofit 的自带的xml的转换器

    ① Interface   // 请求方式 请求头  参数
    ② Retrofit 对象构建 开启异步操作
    ③ 实体类 创建 属性注解  数组类型节点 注解 解析

注意:xml 解析必须写注解 为了 混淆的时候 不出错
实体类上解析的高匹配模式必须要关了
@Root(name = “channel”,strick = false )
若解析xml的开始节点 不是根节点的话 如下书写 :
gradle 文件中添加依赖库

 compile ('com.squareup.retrofit2:converter-simplexml:2.0.1'){
        exclude module: 'stax-api'
    }
package com.bitch.retrofitxmldemo;

import org.simpleframework.xml.Element;
import org.simpleframework.xml.ElementList;
import org.simpleframework.xml.Path;
import org.simpleframework.xml.Root;

import java.util.List;

/**
 * Created by bitch on 16-4-11.
 */
@Root(name = "channel", strict = false)
public class Channel {
    @Element(name = "title")
    @Path("channel")
    private String title;
    @ElementList(name = "item", type = Item.class, inline = true)
    @Path("channel")
    private List<Item> list;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Item> getList() {
        return list;
    }

    public void setList(List<Item> list) {
        this.list = list;
    }
}
Android-Android.动态代理底层基于HttpNet致敬Square的Retrofit A dynamic builder by proxy for HttpNetClient in Android.动态代理,底层基于HttpNet,致敬Square的Retrofit,同样的用法,不一样的实现!Elegant采用Retrofit动态代理 构建的思想,本身并不做网络请求,网络部分基于HttpNet实现,本着简洁清晰的思想,保持了和Retrofit相似的API。 立即下载

相关推荐

FPGA之全数字锁相环(DPLL)

1. 数字锁相环的基本原理和组成 1.1 锁相环(PLL)的简介 锁相环最开始并不是用在数字电路中,而是模拟短路中。对于模拟电路中的锁相环,大家可以参考这篇文章稍微看一下,数字和模拟只是实现的方法不同,但是原理、步骤还是共同的。关于模拟PLL。可以参考一片文章: http://www.sohu.com/a/190569594_464086 首先在学习数字锁相环之前,我们应该先了解什么是锁相环?锁相...

DBLLLLLLLL的博客 5万+

square 的retrofit示例

Retrofit 是一个用于 Android 和 Java 的类型安全的 HTTP 客户端,它可以将网络请求转换为 Java 接口。这意味着可以通过定义网络请求接口来发送请求,而不用手写具体的 HTTP 请求代码。 下面是一个使用 Retrofit 发送网络请求的示例: 首先,需要在 build.gradle 文件中添加 Retrofit 依赖: dependencies {implementat...

weixin_35751412的博客 143

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 288

Retrofit

Retrofit 介绍 Retrofit是Square公司基于RESTful风格推出的网络框架封装。Retrofit是基于OKHttp的网络请求框架的二次封装,其本质仍是OKHttp。 对比 AndroidAsnyHttp 基于HTTPClient,作者已经停止维护,Android5.0不再使用HTTPClient,因此不推荐使用。 Volley 基于HttpUrlConnection,Google官方推出,只适合轻量级网络交互如数据传输小,不适合大文件上传下载场景。 优点 API设计简洁易用 注

八归少年 461

2022(一等奖)B360基于Arcpy与SVM的滑坡易发性评价

此外,在ArcGIS平台下,“易发性图预测(多进程)”工具的运行时间为2h 48m 3s,“易发性图预测(单进程)”工具的运行时间为5h 19m 27s,运行时间缩短了近2h 31m 24s,运行效率提高了47.39%。在ArcGIS Pro平台下,“易发性图预测(多进程)”工具的运行时间为20m 12s,“易发性图预测(单进程)”工具的运行时间为1h 26m 47s,将运行时间缩短了近1h 6m 35s,运行效率提高了76.72%。滑坡的发生受各种影响因素的影响,目前,影响因素的选择没有一个统一的标准。

2301_77310370的博客 1467

NC65实现Restful接口开发及调试

NC65实现Restful接口开发及调试

linzhongshu的专栏 2145

Java后端开发:使用Retrofit进行API调用

Retrofit是一个基于Java的实现服务端API调用的框架,使用注解来描述HTTP请求、参数和响应体,从而通过Java接口的方式来实现服务端API调用。在这个接口中,使用了Retrofit提供的@GET注解来描述HTTP请求的类型和URL地址,使用Call来描述返回的数据类型,其中T可以是任何Java类型,例如字符串、自定义对象等。其中,retrofit是Retrofit框架本身的依赖项,converter-gson是Retrofit的Gson数据转换器的依赖项。一、什么是Retrofit。

chuyouyinghe的专栏 1651

一种基于因果干预的少样本学习的故障诊断模型

本文提出CIRNet,一种融合元学习与因果干预的少样本故障诊断框架。针对传统方法易学习伪相关特征的问题,CIRNet通过构建结构因果模型,采用类级和特征级双调整策略消除先验知识干扰。实验在多个轴承/齿轮数据集上验证其有效性,在跨组件任务中准确率最高达93.41%,特征可视化显示更好的类可分性。相比现有方法,CIRNet显著提升了模型泛化能力和可解释性。

hasakie的博客 955

Retrofit:Square 出品的 HTTP 客户端,43k+ Star

Retrofit是Square公司推出的Android/Java类型安全HTTP客户端库,GitHub Star数超43k。它将HTTP API转换为Java接口,通过注解描述请求方式(GET/POST等),自动生成网络请求实现。核心特点包括:与OkHttp配合使用、支持多种数据格式转换(JSON/XML等)、灵活的Converter机制、RxJava/协程支持。要求Java 8+或Android API 21+,通过Maven即可集成。其简洁的注解式API设计优于原生HttpURLConnection和V

protgb815173的博客 250

MR2数据集实战:5步搞定多模态谣言检测模型训练(附完整代码)

本文详细介绍了如何使用MR2多模态数据集构建高精度谣言检测系统,涵盖环境配置、数据准备、多模态特征工程、模型架构设计、训练调优及部署优化等5个关键步骤。通过双线性融合技术处理文本、图像和网页三模态数据,解决特征对齐和模态冲突等工程难题,并提供完整代码实现和性能优化方案。

weixin_42657024的博客 239

SAP ABAP实战:用BAPI_PO_CREATE1创建采购订单时,如何巧妙处理PBXX和PB00条件类型?

本文深入探讨了在SAP ABAP开发中使用BAPI_PO_CREATE1创建采购订单时,如何有效处理PBXX和PB00条件类型的难题。通过分析外协加工订单的特殊需求,提供了从问题定位到解决方案的全流程方法,包括数据流向追踪、字段控制策略和增强实现方案,帮助开发者解决条件类型自动生成的业务痛点。

weixin_30614109的博客 824

Square全家桶正传——Retrofit使用及配合RxJava实现最大效率开发

写作原因:Retrofit被许多安卓程序员称为当下最优秀的网络请求框架,是Square重要的成员之一。相比传统的网络请求框架,Retrofit更加优秀。所以学习使用Retrofit有重要的意义。此外结合上RxJava使用可以使请求代码逻辑更加清晰。下面一起走进Retrofit的世界。http://square.github.io/retrofit/https://github.com/square/

RoadToGeek技术小栈 707

手把手教你用CubeMX给GD32F103点灯、调串口(附完整工程)

本文详细介绍了如何使用CubeMX为GD32F103开发板配置GPIO点灯和串口通信,包含完整的工程创建、代码构建和测试流程。特别强调了GD32与STM32的差异点及常见避坑技巧,帮助开发者快速上手GD32开发。

weixin_42566424的博客 313

spring-cloud-square源码速读(retrofit + okhttp篇)

提升一点难度,看看spring-cloud-square的另一种类型的源码:spring-cloud-square-retrofit,了解接口自动实现背后的细节

程序员欣宸的博客 880

多音字、形近字.doc

多音字、形近字.doc

1998-2014年工业企业数据库与绿色专利匹配数据

1998-2014年工业企业数据库绿色专利匹配1、时间:1998-2014年2、样本量:470+万3、来源:工企数据库、国家知识产权J、WIPO4、指标:含工企数据库100+指标、各类专利申请和授权、绿色发明专利申请和授权、绿色实用新型专利申请和授权。具体指标参看:https://blog.youkuaiyun.com/m0_71334485/article/details/132637198

Square公司产品线 okhtp retrofit 等等

https://github.com/square 上面是Square公司的开源产品线,你很666  

hnlgzb的专栏 309

cohesive+inp和for子程序.rar_UMAT_abaqus蠕变_cohesive umat_umat和creep_蠕

ABAQUS 有限元子程序,粘弹性本构,蠕变应力松弛测试拟合结果

Square Retrofit:Android 和 Java 的类型安全 HTTP 客户端

Retrofit是Square公司开发的类型安全HTTP客户端框架,适用于Android和Java平台。它将HTTP API定义为Java接口,通过注解标注请求方法、路径和参数,运行时自动生成实现,简化了网络请求代码。Retrofit底层依赖OkHttp处理网络通信,支持多种数据转换器(如Gson、Moshi)。安装简单,最低要求Java 8或Android API 21。自2013年开源以来,Retrofit已成为Android生态中最流行的网络请求库之一。

rhowave33146的博客 174

DAQ.zip_DAQ信号采集_Labview声源_labview声音采集_labview的DAQ_声音采集

运用DAQ对声源信号进行采集,并将采集到的声音信号保存成。WAV格式。

Retrofit基本介绍

1.Retrofit简介Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的。本文介绍是基于Retrofit2.02.Retrofit的基本使用首先在app->build.gradle->dependencies中添加依赖compile 'com.squareup.retrofit2:retrofit:2.1.0' compile

蓝枫 813

Retrofit 2详解和使用(4)——汇总

0X00 写在前面 相信做过Android网络请求的同学都绕不开Volley,Retrofit,OkHttp这几座大山,至于他们的前世姻缘以及孰优孰劣,不在本博客的讨论范围。如题,这篇博客主要介绍一个小白(其实就是我自己)的Retrofit2进阶之路,会结合一个开发实例介绍5节内容: Retrofit2 HTTP请求方法注解的字段说明 Call<T>响应结果的处理问题 Retro...

qq_32534441的博客 1771

五分钟搞懂spring-cloud-square

2021年4月13日,spring在官方博客上宣布,一个名为Spring Cloud Square的项目正式发布首个公开的可用的里程碑版本,一起来了解一下

程序员欣宸的博客 2785

Android Retrofit框架的使用和个人见解

在Android开发中经常会处理网络请求,接触这个框架也有一段时间了,它给了我很多的帮助,希望能分享给android新人。简介 特点 官方 使用 一般的GETPOSTPUTPATCHDELETE方法 文件上传 可能遇到的问题 简介Retrofit官方给出的简介是这样的。 Type-safe HTTP client for Android and Java by Square, Inc. 简而言之

Yat3s 2084

Retrofit 的原理解析

Retrofit是 Square 大神开源的框架,内部封装 OKHttp,采用注解的方式发起网络请求,让我们可以简单使用 OKHttp。这个框架完美融合 Rxjava,加入优雅的异步处理方式,使得其更加强大。正是因为这个框架的出现,很多人学习了 Rxjava 和 OKHttp 的使用。但是这个框架的原理也很是耐人寻味,那他的原理到底是如何实现的呢? 这场 Chat 我们将学习一下知识: Retr...

GitChat 503

Retrofit2中常用的注解介绍

导语 这里只是常用的注解介绍,更详细的请看另一篇博客。 Retrofit2中注解简介和常用的注解使用 1、什么是Retrofit? Retrofit 是一个Square开发的安卓客户端请求库。其中内部封装了okhttp库。官方的介绍是使用非常简短 Retrofit使用注解,能够极大的简化网络请求数据的代码。 Retrofit常用注解包括:@Query,@QueryMap,@Field,@F...

cmyperson的博客 1192

Retrofit的使用

概述 Retrofit 是一个类型安全的 REST 客户端,Square 提供的开源产品。它可以直接解析 JSON 数 据变成 JAVA 对象,甚至支持回调操作,处理不同的结果。 官方地址:http://square.github.io/retrofit/ 在官方地址中可以下载 jar 包,也可以在 AndroidStudio 中引入。 使用 1.首先我们要定义一个接口 p...

weixin_30600197的博客 96

初识Okhttp和Retrofit

Okhttp和Retrofit的出现已经有很长一段时间了,一直都没有去了解过它们,现在正好有一个机会去了解和使用,下面是我对初学Okhttp和Retrofit的一些简要笔记。一、OKhttpOKhttp一个处理网络请求的第三方库,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso)用于替代HttpUrlConnection和Apache HttpClient(...

cylzll的博客 497

Android Retrofit2 使用教程

什么是 Retrofit ? Retrofit是Square开发的一个Android和Java的REST客户端库。这个库非常简单并且具有很多特性,相比其他的网络库,更容易让初学者快速掌握。它可以处理GET、POST、PUT、DELETE…等请求,还可以使用picasso加载图片。 常用注解 Retrofit 2.0底层依赖OkHttp实现,也就是说Retrofit本质上就是对OkHttp的更...

青冘的技术学习博客 3751

[Spring] Spring Cloud Square 0.4.0-M1 版发布 | Retrofit | OkHttp

欢迎加入 Spring cloud 交流群: 617143034 原文地址: https://spring.io/blog/2021/04/13/introducing-spring-cloud-square 文章目录正文如何集成 OkHttpClient 到 Spring Cloud LoadBalancerRetrofit, OkHttpClient, Spring Cloud LoadBalancerRetrofit, WebClient, Spring Cloud LoadBalancer备注推..

邓超的博客 558
上一篇: Gson,FASTjson 解析字符串为数组,日期等方式
下一篇: Html5 添加class 浏览器不支持问题
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值