16、探索Web服务:从基础到应用

探索Web服务:从基础到应用

1. Web服务基础概述

在当今数字化时代,很多人习惯以交互方式使用网站。比如在亚马逊买书,需访问其网站、选书并按提示完成购买;与eBay、谷歌、推特等网站交互时,也需手动操作。但许多网站意识到,企业常需自动化方式高效与网站交互,于是出现了以代码形式访问的Web服务,这只是Web服务的一种,实际上它有多种形式。

Web服务有众多类型,例如企业创建的用于站点间及与合作伙伴等实体进行信息传输的私有Web服务,还有需付费或其他条件才可半私有访问信息的特殊Web服务。不过,无论Web服务是公开、私有还是特殊类型,其基本运行方式相同。

Web服务的一个显著特点是依赖可扩展标记语言(XML),同时它提供有文档说明的接口,只要有正确凭证,无论请求者使用何种平台都能访问。访问Web服务具有一致性,会采用标准化技术确保畅通。简单来说,只要客户端以正确格式提供正确信息,就能发起请求并获得响应。

2. Web服务的定义

Web服务常被神秘化,但实际上并不复杂。可以把它想象成去餐厅用餐,服务员先拿来菜单,之后询问你想吃什么,你告知需求后,最终会得到所点食物。Web服务也是如此,应用程序先请求Web服务能提供的项目菜单,之后告知所需项目,服务就会提供该项目。

大多数Web服务依赖XML进行请求和接收响应,虽然这里的XML可能比基础示例更复杂,但概念相同。Visual Studio IDE能在一定程度上帮助创建请求,不过你仍需明确请求内容。

并非所有Web服务都依赖XML,但绝大多数是这样。大多数公共Web服务选择XML,是因为它能保证在任何编程语言和多平台上都能正常交换数据。有些公共Web服务

相关推荐

GIS应用程序的Web编程教程

这是一门入门级课程。重点是理解概念,尽管会提供示例,但不期望安装软件和跟随。熟悉编程和 GIS 将是有益的,但不是假设。

duoshehuan6005的博客 464

基于C++ asio网络库手搓一个简易的web服务

ASIO 是一个用于网络编程的独立库,提供了异步 I/O 操作的支持。它的设计目标是提供高效、可扩展的 I/O 操作,适用于各种类型的网络应用。跨平台支持:ASIO 支持多种操作系统,包括 Windows、Linux 和 macOS。异步操作:通过异步 I/O 操作,ASIO 可以提高程序的响应性和性能。易于集成:ASIO 可以很容易地与其他库和框架集成,如 Boost 库。在开始编写代码之前,我们先捋捋逻辑首先,我们需要一个 ASIO 服务类(Server)来启动我们的 Web 服务。

秋雨 De Blog 1164

16、深入探索Web服务项目与UML项目创建

本文深入探讨了Web服务项目和UML项目的创建与配置过程。在Web服务项目部分,详细介绍了BPEL流程的设计、复合应用项目的创建、属性设置、JBI模块的添加、部署及测试方法。在UML项目部分,讲解了UML模块的安装、选项设置以及各类UML窗口的使用,包括Palette、Documentation、Properties和Diagram Editor等。文章最后对两种项目的操作流程进行了对比,并给出了实际应用建议,帮助开发者高效进行软件开发与设计。

mongodb5scout的博客 63

16、探索专业服务器控件:数据绑定与菜单、视图控件的应用

本文深入探讨了ASP.NET中的专业服务器控件,重点介绍了菜单控件(Menu Control)的静态与数据绑定填充方式,并结合XML数据源实现网站导航。同时,通过实验详细演示了如何使用GridView和DetailsView控件构建主/详细页面,实现数据展示与编辑功能。文章还涵盖了数据绑定技巧、类结构设计以及安全性注意事项,帮助开发者掌握高效构建交互式Web应用的方法。

ss78901的博客 103

16、使用 JMS 通道访问 Web 服务

本文探讨了如何利用Java JMS(Java Message Service)增强Web服务的服务质量(QoS),比较了SOAP over HTTP与SOAP over JMS的优劣,并通过ServiceMix和Apache Axis客户端示例展示了如何将Web服务绑定到JMS通道以实现可靠的消息传递。内容涵盖JMS的事务、持久性和优先级等QoS特性配置,适用于需要高可靠性的企业级应用。

info6的博客 92

16、OpenResty与Lua:构建安全高效的Web服务

本文介绍了如何利用OpenResty和Lua构建安全高效的Web服务。OpenResty是一个基于nginx并集成Lua解释器的高性能Web平台,适合用于编写Web服务器脚本,支持快速开发和实现安全功能如速率限制和并发控制。文章还讨论了代码安全的最佳实践,包括防止SQL注入、服务器端模板注入以及确保安全的重定向机制,帮助开发者构建更加健壮和安全的微服务系统。

vvv99的博客 133

20、探索Python编程:从基础到高级应用

本文全面介绍了Python编程从基础到高级应用的各个方面,涵盖基础语法、函数与模块、文件操作、异常处理、面向对象编程、数据结构以及高级特性如装饰器、生成器和上下文管理器。同时深入探讨了Python在网络编程、数据库操作、数据分析等领域的实际应用,并提供了优化技巧与最佳实践,帮助开发者提升代码质量和性能。

lambda的博客 169

16、探索Grails:现代Web开发的利器

本文介绍了Grails这一现代Web框架的基本概念、安装步骤及快速创建应用的完整流程。Grails基于Spring和Hibernate,采用‘约定优于配置’原则,极大地简化了Web开发任务。文章还详细描述了Grails的核心功能、目录结构、运行机制以及其在Web开发中的显著优势,帮助开发者快速上手并高效构建Web应用。

http9protocoller的博客 99

16、探索 Rust 中的 API 演进、无畏重构与服务器端渲染

本文深入探讨了使用Rust进行API演进与无畏重构的实践方法,并详细介绍了服务器端渲染(SSR)的基础知识及其在Rust中的实现方式。通过结合Actix Web框架和Tera模板引擎,展示了如何构建功能强大的服务器端渲染Web应用程序。此外,还涵盖了从服务静态网页、生成动态内容、捕获用户输入、显示信息列表到编写客户端测试和连接前后端的完整开发流程。

gpu4optimizer的博客 61

3、探索 Access 2013 开发:从 Web 应用到客户端解决方案

本博文全面介绍了 Access 2013 的开发技巧,涵盖 Web 应用与客户端-服务器解决方案两大方向。内容包括从表格构建、界面设计、视图创建、查询编写到与 SharePoint 的集成及部署安全考虑,以及客户端开发中的数据连接、VBA 增强、用户界面设计、自动化操作、数据库部署与管理等方面。同时,还涉及 SQL Server 升级和对象使用,并提供详细的操作流程和示例代码,帮助开发者高效构建数据管理和应用解决方案。

c6d7e8f9g的博客 125

16、探索服务导向与云计算的前沿进展

本文深入探讨了服务导向架构(SOA)与云计算的最新进展,涵盖DevOps实践、API管理、云资源优化以及智能制造领域的技术创新。通过理论与实践相结合的方式,帮助读者理解并应用这些先进技术,推动企业IT架构和运营模式的升级。

weixin_36303305的博客 302

5、多领域技术融合:Web服务、农业搜索与XML编码的创新探索

本文探讨了多领域技术融合的创新方法,包括混合Web服务选择、本体驱动的农业搜索引擎以及基于字符串的动态XML标签编码技术。通过结合语义与关键字匹配,优化了Web服务发现效率;通过构建农产品本体,实现了农业信息的语义级检索;通过改进XML编码技术,提升了XML数据处理性能。这些技术为相关领域的发展提供了新思路和解决方案,并展望了其未来发展趋势。

redis7keeper的博客 101

16、探索浏览器事件模型:从基础到高级

本文深入探讨了浏览器事件模型的发展与应用,从早期的DOM Level 0事件模型到标准化的DOM Level 2事件模型,详细解析了事件冒泡、事件捕获、阻止事件传播和取消默认动作等核心概念。文章还分析了不同浏览器对事件模型的支持差异,并结合实际场景提供了事件模型的选择建议及最佳实践,帮助开发者构建交互性强且性能优化的Web应用。

www00的博客 73

50、探索RESTful Web服务与GraphQL:数据交互的新选择

本文探讨了现代Web开发中数据交互的两种方式:传统的RESTful Web服务和新兴的GraphQL技术。详细介绍了从消费RESTful服务到构建GraphQL服务器的全过程,包括模式定义、解析器实现和服务器配置。同时分析了GraphQL的优缺点,并提供了选择合适数据交互方式的建议,旨在帮助开发者根据项目需求选择最合适的技术方案。

wdx0123456的博客 52

Web浏览器:探索编程世界

Web浏览器是一种软件应用程序,允许用户在互联网上浏览和访问各种网页和多媒体内容。它通过使用HTTP(超文本传输协议)协议从服务器下载网页,并通过HTML(超文本标记语言)和CSS(层叠样式表)等技术将网页呈现给用户。常见的Web浏览器包括Google Chrome、Mozilla Firefox、Microsoft Edge和Safari等。除了提供网页浏览功能,Web浏览器还支持JavaScript这样的脚本语言,使开发者能够在网页上实现交互和动态效果。

YOLO_CODE的博客 182

基于混合储能协调控制的三相并网逆变系统设计【附说明文档】

内容概要:本文围绕“基于混合储能协调控制的三相并网逆变系统设计”展开,系统阐述了蓄电池与飞轮储能等混合储能系统在微电网中的协同控制策略。研究涵盖三相并网逆变器的能量管理、SOC(荷电状态)恒压恒流充放电控制、PQ控制与双闭环控制等核心技术,并基于Matlab/Simulink仿真平台实现了系统建模与动态仿真验证。文中深入探讨了飞轮储能系统的机侧PQ控制与网侧变流器的恒压双闭环控制,分析了微电网在调频调峰、功率协同分配等方面的运行特性,强调多能源间的协调优化与系统的快速动态响应能力,旨在提升微电网的运行稳定性、电能质量及能源利用效率。; 适合人群:具备电力电子、自动化或电气工程等相关专业背景,从事新能源发电、微电网控制、储能系统集成与优化等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入研究混合储能系统在微电网中的协调控制机制与能量管理策略;②掌握三相并网逆变器的建模、控制算法设计及Matlab/Simulink仿真方法;③实现储能系统的高效充放电管理与并网功率精确控制;④为学术论文撰写、科研课题申报、工程项目开发或实验复现提供完整的技术方案与参考实例。; 阅读建议:建议结合所提供的仿真模型、说明文档及参考文献,按照系统架构从单元控制到整体协调的顺序分模块学习,重点关注各控制策略的设计原理、参数整定方法与协同逻辑。推荐在Matlab环境中动手复现仿真,通过调整参数和工况来观察系统响应,以深化对理论知识的理解和工程应用能力的掌握。

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 842

Node.js内存溢出?一招搞定JavaScript heap out of memory错误(附永久配置方案)

本文深入解析Node.js内存溢出问题,提供从临时调整到永久配置的完整解决方案。重点介绍通过设置`max-old-space-size`参数和`NODE_OPTIONS`环境变量来扩展JavaScript堆内存限制,适用于Webpack、Vite等构建工具的大型项目场景,并涵盖Windows、Linux/macOS多平台配置方法。

cake8的博客 1053

华为交换机实战:如何用ACL+流分类精准限制特定IP的网速(附完整命令)

本文详细介绍了华为交换机如何通过ACL+流分类技术实现精准IP限速,包括ACL规则配置、流分类关联、流行为定义及流策略应用等完整步骤。文章提供了实战命令和配置验证方法,帮助网络管理员有效管理带宽资源,解决特定IP占用过多带宽的问题。

weixin_29229055的博客 99

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 602

OSGEarth 基于鼠标位置缩放

说明 osgearth 原有漫游器EarthManipulator 不支持此功能,所以需要修改此漫游器代码,其中主要原理就是在缩放的同时也要改变当前漫游器中心焦点的位置,从而保持鼠标指定点的位置缩放是不改变。 核心代码修改部分 EarthManipulator 的头文件zoom方法添加参数view /** * Zoom the camera using delt...

Rsoftwaretest的专栏 3780

【GlobalMapper精品教程】070:专题地图制作完整操作教程

与其它GIS软件一样,Globalmapper也可以制作出漂亮的地图,本文讲解专题地图制作完整操作流程。

智慧空间实验室 3746

MATLAB基础应用精讲-【图像处理】GNN图神经网络(附python代码实现)

图神经网络由于其在处理非欧空间数据和复杂特征方面的优势,受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。图结构可描述复杂关系,如基因结构、通信网络、交通路线、社交网络等。图计算挖掘结构信息,但无法学习节点特征。神经网络在欧氏空间数据上表现优越,但无法直接应用于非欧氏空间的图数据。图神经网络结合图计算和神经网络优势,处理非欧氏空间数据及其复杂特征,应用于网络链接预测、推荐系统和交通道路分析等场景。实际应用中,图数据规模庞大,如百亿级节点、千亿级边,存储开销超过10TB。

qq_36130719的博客 1137

BMS硬件设计要点:从STM32主控到BQ76920监控芯片的工程实践

电池管理系统(BMS)是锂电安全与寿命保障的核心,其硬件设计涉及微控制器选型、专用监控芯片接口、电源完整性、信号完整性及PCB布局等多维度协同。基于STM32与BQ76920的典型双层架构,需深入理解功能安全解耦原理——关键保护由ASIC硬件实现,算法决策交由MCU完成,契合ASIL-B等级要求。技术价值体现在毫秒级硬件保护响应、±10mV电压采样精度及抗EMI鲁棒性设计;广泛应用于电动工具、储能系统与轻型电动车等中高功率场景。本文聚焦BMS控制板硬件实现中的高频时钟EMC、I²C总线信号完整性、被动均衡可

weixin_30591519的博客 92

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 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")

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 32、深入理解日志框架:从基础到 Rust 实践
下一篇: 7、可编程支付通道:实现区块链支付的灵活性与扩展性
普通网友
博客等级 码龄27年 204粉丝 1502原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值