表单提交和json提交(重要)

用ffmpeg+Python自动整理录屏:批量元数据提取与按时段归档 在视频素材日益增多的今天,随手命名的录屏文件容易堆积成无序的数据孤岛。面对这类文件,需要一套基于命令行与脚本的自动化管理思路。通过ffprobe读取视频时长、编码等元数据,结合Python脚本解析文件名中的日期与时段信息,可以实现批量重命名、素材库归档与索引生成。其技术本质是利用标准工具链将人工判断转化为可重复的规则流程,提升文件管理的确定性与效率。此类方案适用于直播回放、课程录像、会议记录等周期性产生文件的场景,也可扩展到OCR标签、定时扫描等更高阶需求。本文提供一套从环境配置到脚本实现的方法,帮助用户搭 阅读详情
AI摘要

本文深入解析HTTP协议中Content-Type的使用,包括application/json与x-www-form-urlencoded的区别,以及何时使用JSON或表单传参,为前后端开发人员提供清晰的指导。

https://blog.youkuaiyun.com/qq_15037231/article/details/80403581?utm_source=blogxgwz0

背景

在前后端分离的开发组中,前端通常对自己代码组织的比较细致,都会对AJAX,或者小程序API做封装。而很多前端开发对后端接口要求的传参 一头雾水,后端开发人员对HTTP一知半解,传参接收不到,说不清楚,互相推脱,谁谁应该改传参方式。

HTTP协议中:Content-Type,估计是非常非常多的人弄不清楚。

本质上Content-Type 要么就是 text/html要么就是 json要么就是 表单。

本质上 非常简单,但总是有人搞不清楚,总是在这个上面浪费时间。

JSON

当Content-Type 为 application/json 的时候,HTTP POST请求数据必须是JSON的。
任何框架都必须遵守这个协议,如果不支持,则说明框架不完善,开发者可能知识比较片面。

例子:

 
  1. HTTP POST

  2.  
  3. header:

  4. Content-Type: "application/json"

  5.  
  6. body:

  7. {

  8. "key1": value1,

  9. "key2": value2

  10. }

其中整个JSON就是 参数本身,他没有KEY,没有名称。key1 ,key2严格说只是属性。

表单

当Content-Type 为 x-www-form-urlencoded 的时候,POST 的请求数据必须是表单的。
甚至很多开发者印象中,参数就是个名字为key 值为value这种印象,这是非常肤浅的认识。

例子:

 
  1. HTTP POST

  2.  
  3. header:

  4. Content-Type: "x-www-form-urlencoded"

  5.  
  6. body:

  7. key1=value1&key2=value2

  8.  

何为表单参数,就是以x-www-form-urlencoded为编码的数据参数,其中key1 和 key2就是参数。整个内容就是为 以& 分隔的参数列表。

表单2

例子:这里用Chrome的F12中Network类似的表示HTTP POST请求

 
  1. HTTP POST

  2.  
  3. header:

  4. Content-Type: "x-www-form-urlencoded"

  5.  
  6. body:

  7. key1=value1

  8. key2={"key3":value3, "key4": value4}

  9.  
  10.  

那这个其实也是表单!!!!!他的形式是表单里面嵌套了一个JSON字符串,作为其中的一个参数。

弄清楚这个了,其实根本不需要为了传参而争论半天。

什么情况应该用什么传参?

如果参数比较单一,只做GET查询的时候,建议直接GET。URL上面就是表单参数,和POST的表单一模一样。

如果参数还是比较单一,但是参数值太多了,很长很长的字符串,用POST是毋庸置疑的。
这个时候,POST JSON和表单其实是一样的,都是在请求体里面。

如果参数是结构化的,用POST JSON,毋容置疑。

如果参数是结构化的,还需要AUTH,;例如带个TOKEN,那么:

  • 使用上面的表单2,伪JSON表单,这种情况的坏处就是JAVA后端的 Model解析比较别扭,不太好建模。
  • 使用URL + 公共参数、Token,其余参数放在Body,以POST JSON传参,没有坏处,好处就是后端做拦截器,或者Filter的时候比较统一明了,不需要在Model里面涉及 公共参数。唯一的坏处就是,前端同学可能懒得弄。

小程序前端 与后端配合开发的经验

前端封装的框架,必须支持 公共参数追加到URL,并且可以以JSON传参。
后端就可以依据以上的情况,灵活使用参数组织方式了,处理业务的代码专心接受参数,
拦截器直接通过URL获取公共参数和Token,来做一些版本控制,身份认证等功能。

JSON vs 表单格式:两种常见请求格式的区别与应用 阅读详情

相关推荐

requests库如何处理 - POST请求常见的两种请求体格式:表单格式&JSON格式

requests库如何处理 - POST请求常见的两种请求体格式:表单格式&JSON格式

孤寒者的博客 1万+

POST请求发送的表单数据和json数据的区别及python代码实现

前言 这篇博客会介绍最常见post 请求form表单数据和json数据 数据类型之间的区别, urllib代码的实现(python), requests库实现, 以及如何使用postman软件发送这些类型数据 下面所有请求的例子,我都会用到一个接口:http://httpbin.org/post 这个接口可以返回提交的数据类型以及请求头信息 数据类型 这里说一个重要的请求头的参数 Content...

Hello_wshuo 2万+

告别手动解析!用这个Qt库轻松处理Cat 21/62等18种Asterix航空数据

本文介绍了基于Qt框架的高效Asterix报文解析库,帮助开发者轻松处理Cat 21/62等18种航空数据。该库通过协议抽象化、多维度API设计和跨平台支持,解决了手动解析的复杂性和易错问题,显著提升开发效率和系统可靠性。

weixin_42529366的博客 207

表单提交和json提交的区别

1 表单提交 (1)从前端传过来的请求参数是key=value形式的 (2)springmvc自动进行参数的绑定 2 json格式提交 (1)前端传过来的参数是字符串,以json格式呈现 (2)springmvc接收需要使用@RequestBody注解,对json字符串进行解析 ...

water1730的博客 4613

ORCA(动态避障)算法

A物体沿着向量v1和v2移动,刚好能和B擦肩而过,不会发生碰撞;若V1和V2的夹角再小一点的话就一定会发生碰撞。A的速度为V1,B的速度为V2,A对于B的相对速度(也就是我们把B看做静止,A的速度)就是V1-V2。,那么怎么判定A的速度向量是不是在碰撞区域内呢?这就需要用A相对于B的速度来判定。红线画出来的锥形区域就是A相对于B的。

u012861978的专栏 4768

为R720安装iDRAC Service Module

这玩意找了好久资料, 教程都不咋靠谱, 要不就是有不理解的地方 所以直接一路莽着过河: 去官网找到设备对应的驱动程序: 几个查找筛选项看图 官网链接: https://www.dell.com/support/home/zh-cn/product-support/product/poweredge-r720/drivers 在下方的列表中找到对应系统版本的驱动并下载: 由于安装的系统为ESXi 6.5 U2 Dell定制版, 这里没有刚好的驱动, 所以下了个兼容的: 下载好后是一个压缩包:

Janus 6361

80%的web开发者都很蒙的『表单提交』和『JSON数据提交』

摘要:HTTP POST请求中,JSON提交和表单提交的主要区别在于数据格式和适用场景。表单提交(x-www-form-urlencoded或multipart/form-data)适合简单键值对和文件上传,兼容性强但缺乏复杂结构支持;JSON提交(application/json)支持嵌套对象、数组等复杂结构,数据类型明确,更适合前后端分离的API交互。表单提交在处理文件时不可替代,而JSON在结构化数据传输上更高效。选择依据包括数据复杂度、文件需求和前后端技术栈。

qq_51145696的博客 1582

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 386

python提交表单和提交json

python提交表单 #!/usr/bin/python # -*- coding:utf-8 -*- import httplib,urllib,json; def SendRedPacket(): params = urllib.urlencode({'count':'100', 'amount':'6666', }); headerdata =

幻想之渔 2210

ENVI-met新手必看:从零开始创建城市微气候模型(附详细步骤+底图制作技巧)

本文为ENVI-met新手提供从零开始创建城市微气候模型的详细指南,包括环境准备、参数配置、底图制作技巧和三维模型构建步骤。特别针对常见问题提供解决方案,帮助初学者快速掌握城市微气候模拟技术,提升建模效率。

weixin_29269441的博客 404

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3515

html表单发送json,json和form表单两种参数提交方式

本篇主要介绍在http请求post传参的场景,有了之前GET相关的介绍,相信POST的使用大家也能快速的掌握。POST的请求处理和GET请求最大的区别无非是参数的传递方式,所以在Gatling脚本里主要是去设置http body Content-Type。本篇主要介绍json和form表单两种参数提交方式的处理:JSON方式import io.gatling.core.Predef._import...

weixin_39705069的博客 1472

视觉语言模型对抗攻击与防御:从传统方法到多模态挑战

本文深入探讨了视觉语言模型(VLM)面临的对抗攻击与防御挑战,从传统单模态攻击到多模态威胁的演进。分析了包括FGSM、PGD等经典攻击方法,以及新兴的多模态攻击如跨模态对抗样本和越狱攻击。同时提出了跨模态一致性检查、动态防御机制等创新防御策略,并结合医疗影像诊断等实战案例,为提升AI系统安全性提供了重要见解。

weixin_29231725的博客 391

Json提交和表单提交

研究了一下关于post请求时候发送参数的两种方式,**表单形式**和**JSON**形式。

AkiraZ的博客 1684

安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案

本文主要介绍了安装WSL过程中出现注册表编辑器无法重命名WSL。重命名项时出现错误的解决方案,希望能对使用Windows WSL的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 9万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot同一接口兼容Form表单和JSON两种提交方式

0.前言  在我目前的项目中,是使用Vue.js和Java Spring方式的前后端分离,使用JSON格式数据交互,但常常网页提交的数据是Form表单。为防止未来开放API接口或者开发AP...

独行侠梦的博客 4390

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Retrofit如何实现Form表单提交和Json提交-by:nixs

我们都知道在Http请求方法中一般分为Get和Post请求。但是实际上不止这两种:HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式。 1、OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 2、HEAD 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。 3、GET 向特定的资

学习一定要有针对性的练习-实操! 1089

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

form表单提交和JSON区别

传递的数据比较简单,那么两种方式基本上没什么大区别(当然后台接收数据的方式肯定是不同的),但是如果数据比较复杂,比如包含数组、对象等时,就只有json才能胜任了。此外,如果数据是通过表单提交的,那么当然使用默认的form即可,因为它会自动构建数据结构,无需手工拼接;而如果是通过ajax发送数据,则最好使用json,因为可以通过简单的方法把对象转换为json字串。

mywaya2333的博客 1102

java post请求的表单提交和json提交简单小结

在java实现http请求时有分为多种参数的传递方式,以下给出通过form表单提交和json提交的参数传递方式: 1 public String POST_FORM(String url, Map<String,String> map,String encoding) throws ParseException, IOException{ 2 Strin...

weixin_30300523的博客 651

python post 请求json文件_requests的post请求提交表单、json串和文件数据讲解

HTTP协议中没有规定post提交的数据必须使用什么编码方式,服务端根据请求头中的Content-Type字段来获取编码方式,再对数据进行解析。具体的编码方式包括如下:- application/x-www-form-urlencoded # 以form表单形式提交数据,最常见最熟悉- application/json # 以json串提交数据。- multipart/form-data # 上传...

weixin_39808893的博客 1659

基于springboot 使用 RestTemplate 进行post请求 ------ 表单方式提交 和 json方式提交

本人小白一个,不能保证博客中内容都准确,如果博客中有错误的地方,望各位多多指教,请指正。欢迎找我一起讨论 不管是什么方式进行提交,基于springboot 使用 RestTemplate,请先写RestTemplate 的 配置类 @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate( ClientHttpRequestFactory factory) { RestTem

问题少年阿涛的博客 2067

from表单提交和JSON区别

form表单是“键值对”的数据格式,例如: a=1&b=2&c=3 而json格式则与之不同,如下: {"a":1,"b":2,"c":3} 转自:https://blog.youkuaiyun.com/qq_15037231/article/details/80403304 ...

@凌晨三点半的博客 3462

Retrofit实现Form表单提交和Json提交

json格式: 直接传递整个对象,Retrofit会帮我们把对象转换成Json,然后传递给后台服务器。使用@Body ,@POST注解。 (@HeaderMap可以配置请求头) 表单格式: Form表单提交,后台服务器是以键值对的形式来接受参数的,所以Retrofit把接口参数通过Map的形式来提交。使用@FieldMap,@POST,@FormUrlEncoded注解。 参考:常用HT...

hnnd123的博客 4128

Koa 提交和接收 JSON 表单数据

来自 url 中的 query 参数可直接通过 context.query 获取,但 POST 方式提交的表单数据则需要借助中间件的解析来完成,比如 koa-bodyparser。 首先准备好一个表单页面,为了演示,其中包含一个数组类型的数据。 index.html <!DOCTYPE html> <html lang="en...

weixin_30367873的博客 1613
上一篇: java内外部比较器(Comparator、Comparable) (重要)
下一篇: eclipse手动添加本地jar包到本地maven仓库
周末去看海
博客等级 码龄9年 50粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值