@RequestHeader注解,以及它的参数的作用

请求头部(Request Headers) 请求头部(Request Headers)是HTTP请求的一部分,它们包含了关于请求、客户端环境和期望响应的元数据。 阅读详情

@RequestHeader 注解用于从 HTTP 请求的头部获取特定的信息,并将其注入到方法参数或控制器类的属性中。

@RequestHeader 注解可以应用于方法的参数或控制器类的属性上。它有以下常用的参数:

  1. value:指定要获取的请求头的名称。可以使用该参数来指定不同的请求头名称,例如 @RequestHeader("User-Agent")。

  2. required:指定请求头是否为必需,默认为 true。如果设置为 true,而请求中没有包含该请求头,将会抛出异常。如果设置为 false,则在请求中没有包含该请求头时,方法参数或属性将会被设置为 null。

  3. defaultValue:指定当请求中没有包含该请求头时的默认值。如果没有设置默认值且请求中没有包含该请求头,方法参数或属性将会被设置为 null。

下面是一个示例,演示了如何使用 @RequestHeader 注解:

@Controller
@RequestMapping("/example")
public class ExampleController {

    @GetMapping("/header-info")
    public String getHeaderInfo(@RequestHeader("User-Agent") String userAgent) {
        // 处理获取到的 User-Agent 信息
        return "header-info";
    }
}

在上述示例中,getHeaderInfo 方法使用 @RequestHeader 注解将名为 "User-Agent" 的请求头的值注入到 userAgent 参数中。然后,你可以在方法体中使用 userAgent 进行进一步的处理。

这样,当客户端发送请求时,如果请求头中包含 "User-Agent",Spring MVC 将会将其值传递给 userAgent 参数。如果请求头中没有包含该请求头,将会抛出异常(除非将 required 参数设置为 false)。

 

这段代码是一个控制器方法,用于查询用户信息。它接收两个参数:id 和 truth。

  1. @PathVariable("id") Long id:这是一个路径变量参数,使用 @PathVariable 注解将 URL 中的占位符参数 "id" 绑定到 id 参数上。这样,当客户端请求 /example/queryById/123 时,其中的 "123" 将被绑定到 id 参数上,作为方法的输入。

  2. @RequestHeader(value = "Truth", required = false) String truth:这是一个请求头参数,使用 @RequestHeader 注解将名为 "Truth" 的请求头的值绑定到 truth 参数上。value 参数指定了要获取的请求头的名称,即 "Truth"。required 参数设置为 false,表示该请求头是可选的,如果请求中没有包含该请求头,truth 参数将被设置为 null。

通过 @RequestHeader 注解,你可以方便地获取请求头的值,并在控制器方法中进行相应的处理。

OpenFeign调用微服务使用RequestInterceptor或@RequestHeader传递http请求头信息 记录:391 场景:基于Spring Cloud OpenFeign调用微服务Restful接口时,请求头从A服务传递到B服务,可以使用RequestInterceptor接口或者@RequestHeader注解传递请求头信息。 阅读详情

相关推荐

Spring MVC相关注解运用 —— 上篇

大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!OK,从上面程序我们可以知道,要先访问/t1,再访问/t2,才可以获取name的值。可以看得到确实打印了请求头的相关数据:比如说windows系统,多少位,浏览器的版本等。这里规定了请求参数必须带有age,但是下方方法参数列表没有age,那我们测试一下有age和无age。OK,当请求路径有该参数时,就按照请求路径的参数值来输出,可以看得到确实是测试成功了。

2501_90253404的博客 1279

@RequestHeader简介

当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request Header) 用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如: Accept 浏览...

rookiediary的博客 4万+

Spring注解篇:@RequestHeader详解

在Spring MVC框架中,注解是一个用于访问HTTP请求头的强大工具。它允许开发者以声明式的方式获取和使用请求头中的信息,从而增强了Web应用程序的功能和灵活性。本文将详细介绍注解的使用方法、工作原理以及在实际开发中的应用。通过深入的源码解析、丰富的使用案例和场景分析,以及对优缺点的全面考量,读者将能够深入理解的实用性和灵活性。注解用于将HTTP请求头的值绑定到控制器方法的参数上。它可以获取单个请求头的值,也可以获取所有请求头,并将其作为或Map类型传递给方法参数。注解的核心属性包括value。

喵手的博客 1583

使用@RequestHeader注解获取HTTP请求头信息

注解是Spring框架中的一个注解,用于从HTTP请求头中获取特定的信息。通过使用注解,我们可以方便地获取HTTP请求头中的各种信息,如用户代理、授权信息、内容类型等。注解可以用于方法的参数或方法的参数注解上。当用于方法的参数时,它将绑定HTTP请求头的值到方法参数上;当用于方法的参数注解时,它将绑定特定请求头的值到被注解的参数上。

果酱 の 博客 1万+

基于PCA的故障诊断方法(matlab)

1. PCA原理分析 PCA的原理主要是将原始数据进行降维。其具体工作原理参照:CodingLabs - PCA的数学原理 2. 数据预处理 训练数据集(只有正样本)为维数据,即有n个采样值,每个采样值有m个特征。 2.1 数据归一化 将数据X针对每个特征归一化为均值为0,均方根为1的数据。 其中: 3. PCA降维 3.1 首先求取协方差矩阵 协方差矩阵的公式为: 计算出来的协方差矩阵为特征m*m维矩阵。 3.2 求取特征值和特征向量 求取协方差矩阵R的特征值.

tangxianyu的博客 1万+

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1755

关于Url请求相关的几种SpringBoot参数注解

@RequestParam,@PathVarlable,@RequestHeader,@CookValue,@RequestBody注解的几种用法

m0_74101005的博客 1885

【3D目标检测】环境搭建(OpenPCDet、MMdetection3d、Det3d)

在Conda虚拟环境中搭建MMdetection3d环境

qq_44703886的博客 4252

Spring MVC 获取前端参数的注解

Spring MVC 获取前端参数的注解 在与前端交互的开发过程中,出现过几次无法取到参数的情况,费了些时间去排查问题,下面就简单总结一下。 注解详解 我们所要获取的前端传递参数大概可以分为以下四类: requet uri 部分的注解:@PathVariable request header部分的注解:@RequestHeader, @CookieValue request bo...

hyl999的专栏 999

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码)

本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。

weixin_30369041的博客 249

优秀的 Verilog/FPGA开源项目介绍(二十六)- ISP (图像信号处理)

介绍查看《ISP算法及架构分析介绍》今天项目的顺序就是先介绍几个关于ISP算法架构的项目,包括python、matlab、c等高级语言实现的ISP算法架构,最后介绍一个FPGA实现ISP的项目。openISPhttps://github.com/cruxopen/openISP项目介绍用python实现的ISP架构,该架构涉及到的知识如下:下图是最新实现的模块:主要模块如...

OpenFPGA的博客 4946

springboot接收参数的注解

@RequestHeader 主要用来获取发起http请求时候,header头的传递参数: 类似于: 假如我在header头中添加了一个token参,那么在后端需要获取token的值然后进行验证之类的,就可以这样获取: @RequestHeader("token") String token @RequestBody 主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的),所以一般应用到POST/PUT提交方法。也就是前端提交form表单数据的json格式。 前端需要.

CYC的博客 4628

33、Windows Server 2016 系统管理与安全防护指南

本文详细介绍了Windows Server 2016系统中的三大核心管理与安全功能:WSUS补丁管理、Windows Defender反恶意软件配置以及Windows Server Backup数据备份与恢复。涵盖WSUS初始同步、组策略配置客户端、混合环境更新评估流程;Windows Defender的图形化与PowerShell管理方式,以及通过组策略集中管控;Windows Server Backup的安装、单次与计划备份设置、增量备份机制和文件恢复操作。内容适用于企业IT管理员进行系统维护与安全防护

beta5的博客 97

SpringBoot中关于参数基本注解

学习SpringBoot过程中,参数这几个注解一直傻傻搞不清,今天做一个总结! 1. @PathVariable注解与@RequestParam注解 这两个注解开始搞混了,报了400的错还一直找不到,就放一起,便于对比区分。 @PathVariable: 作用:接收请求路径中占位符的值,举个栗子: @RequestMapping("/user/{id}") //请求地址"localhost:8080/user/{id}" @PathVariable("id")Integer id //@PathVar.

cheng__yu的博客 1393

【目标追踪】python背景模型减除法原理及其实现

python基于背景模型差法的视频目标追踪帧差法的问题:背景模型差法目标追踪原理1. 基本思路:2. 图例讲解:3. 存在的问题&如何解决:4. 最终效果预览第一步——调用摄像头:1. 使用opencv打开视频or摄像头:2. 读取逐帧图片:第二步——处理图片:1. 转换成灰度图:3. 累加权重重构背景:3. 计算像素差:3. 使用中值滤波和膨胀腐蚀去噪:3.1 中值滤波:3.2 图像腐蚀...

梁瑛平的博客 1948

Euro-NCAP-HWA测试流程中文版V1.1(2023发布)

在本协议中,使用了以下术语:Vehicle undertest (VUT) – 指根据本规程测试的车辆,车上有碰撞前的碰撞缓解或避免系统Global VehicleTarget (GVT) – 指本协议中使用的车辆目标,其定义见TB025—Euro-NCAP全球车辆目标规范v1.0辅助其他车辆(SOV)--指最新的 AEB VRU 测试规程中定义的 "大型障碍车辆"(而非机器人控制的平台),用于本规程中的 "切出 "测试。Time To Collision (TTC) – 指在VUT碰撞GVT之前的剩余时间

小明师兄的博客 595

springmvc @RequestParam @RequestBody @CookieValue @RequestHeader

简介: handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)A、处理request header部分的注解: @RequestHeader, @CookieValue; B、处理request body部分的注解:@RequestParam, @RequestBody; @RequestHeader 注解,可以把R

ooiuy450的专栏 519

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Spring MVC 常用请求处理注解总结

从请求体到 Java 对象的转换:从 Java 对象到响应体的转换:相当于的组合注解这两个注解通过 HttpMessageConverter 实现了 HTTP 数据与 Java 对象之间的自动转换,大大简化了 RESTful API 的开发。注意需配合或依赖 Jackson 等序列化框架解析请求体二、@RestController的作用是 Spring Boot 中一个组合注解,等价于。它表明该类中的所有方法的返回值都直接作为 HTTP 响应体返回,而不是视图名称。1.为何不需要因为已隐含了。

m0_73941339的博客 1258

jre9下载 jdk9

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

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

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

@RequestHeader

从Http请求头中提取指定的某个请求头.等价于HttpServletRequest.getHeader(String) 具体代码: @RequestHeader(value = "x-Device", required = false) 其中 (1)value:参数名例如: Accept (默认为空字符串) (2)required:是否请求路头中必须带value指定的参数(默认为tr...

hello__word__的博客 1815

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot2:请求处理原理分析-接口参数的常用注解

SpringBoot

Brave_heart4pzj的博客 683

SpringMVC接收参数

SpringMVC接收参数

JngKang的博客 639

【SpringBoot】15 核心功能 - Web开发原理 - 请求处理 - 常用请求参数注解

本文介绍了Spring MVC中常用的参数注解,重点解析了@PathVariable的作用与使用方式。@PathVariable用于从URL路径提取变量值并绑定到方法参数,适用于REST风格设计。通过代码示例演示了如何从/car/{id}/owner/{username}路径中提取id和username参数,并支持将变量收集到Map中。文章还对比了@PathVariable与其他注解的区别,并分析了其类型转换、变量名匹配等运行机制。最后总结了该注解在RESTful API开发中的典型应用场景。

杰西笔记 1258

三个HTTP请求参数注解@RequestHeader、@RequestParam和@RequestBody的使用对比

RequestParam的参数是否必需,默认是必须的,可以通过required=false设置可选。而@RequestHeader也有类似的属性。@RequestBody通常对应整个请求体,所以一个方法只能有一个@RequestBody参数,因为请求体只能读取一次。@RequestBody 的限制:一个方法中最多只能有一个 @RequestBody(因为请求体只能读取一次)。需配合 Content-Type 头(如 application/json)使用,否则可能解析失败。

tigerhhzz的博客 1565

SpringMVC之常用注解

前言 Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容可以分为四类(常用的类型)。 第一类:处理request body部分的注解有:@RequestParam和@RequestBody 第二类:处理requet uri部分的注解有:@PathVaribale 第三类:处理request header部分的注解有:@RequestHeader和@CookieValue 第四类:处理a

zsmsxbl的博客 259

SpringMVC常用注解

前言 Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容可以分为四类(常用的类型)。 第一类:处理request body部分的注解有:@RequestParam和@RequestBody 第二类:处理requet uri部分的注解有:@PathVaribale 第三类:处理request header部分的注解有:@RequestHeader和@CookieValue 第四类:处理a

weixin_45683958的博客 251
上一篇: 线程池隔离和信号量隔离的区别,它们的优缺点
下一篇: 简单讨论下熔断策略
小小懒懒
博客等级 码龄5年 449粉丝 312原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小小懒懒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值