28、深入理解Web API中的多态资源

深入理解Web API中的多态资源

1. 多态资源的数据存储

在多态资源的数据存储方面,不同类型的资源需要存储不同的字段。例如,正方形需要存储边长,而三角形需要存储底和高。为了真正表示这些不同形状的细节,我们需要在资源上存储不同的字段。为了解决这个问题,我们需要进行服务器端验证,使通用接口包含所有必要的字段,从而能够存储对应于各种子类型的字段。

比如,Shape资源可能需要有存储半径(用于圆形)、底和高(用于三角形)以及边长(用于正方形)的方式,并根据类型规范验证这些值。

然而,细节往往会使情况变得复杂。例如,如果API请求中包含了不适用于该资源类型的字段(如为正方形类型的Shape资源定义半径),应该将其视为错误还是忽略呢?

2. 何时使用多态资源

在设计API时,我们常常会发现两个提议的资源之间存在共性,这让我们重新思考它们是否应该作为两个独立的资源。例如,在聊天API中,可能会有TextMessage资源以及PhotoMessage、VideoMessage或AudioMessage资源。它们都代表通过聊天API发送的消息,但内容有所不同。

在本地编程时,我们可能会考虑使用Message接口和几个实现该接口的类,目标是编写只处理通用Message接口类型值的代码,而不是特定的实现。但这种逻辑是否适用于Web API呢?也就是说,我们是否应该使用通用性的论据来决定是否使用单个Message资源,而不是为每种消息类型创建多个独立的资源?

虽然直觉上可能是正确的,但逻辑并不完全适用。在本地编程语言中,我们关注的是通用性以及编写支持未来扩展和代码重用的函数。而在Web API中,我们更应该关注各种标

相关推荐

JavaWeb开发者必备API文档大全

JDK(Java Development Kit)是用于构建和运行Java程序的软件开发工具包。Java 9和Java 8是两个广泛使用的JDK版本,它们各自拥有独特的特性。JDK 9引入了模块化系统,改善了内存管理和性能;而JDK 8引入了Lambda表达式、流API和新的日期时间API,显著提高了Java的编程效率。在某些特定情况下,可能需要扩展或者自定义Jsoup的解析器来适应特定的HTML结构。你可以通过继承类来实现自定义的解析逻辑。

weixin_30205153的博客 701

深入理解MooTools 1.2:全面的API参考手册

本文还有配套的精品资源,点击获取 简介:MooTools是一个功能强大的JavaScript库,有助于开发交互式和响应迅速的网页应用。1.2版本的MooTools API引入了面向对象的编程模型,提供了丰富的事件处理、选择器引擎、DOM操作、动画效果、AJAX、拖放功能、实用工具、模块化设计以及优秀的跨浏览器兼容性。通过学习这个版本的API,开发者能高效地编写JavaScr...

weixin_35756690的博客 1636

深入理解Java Web开发:蛋糕商城源码项目分析

自定义异常允许我们创建自己的异常类,以便更准确地描述特定的错误情况。异常链则允许一个异常被另一个异常捕获,从而能够保留原始异常的堆栈跟踪信息。自定义异常:通过继承Exception类或其子类来创建。异常链:通过在catch块中创建一个新的异常,并将捕获到的原始异常作为参数传递给新异常的构造器。代码示例try {

weixin_34725745的博客 390

全面掌握ASP.NET网站搭建的资源大全

ASP.NET是一个开放源代码的Web开发框架,由微软公司开发。它运行在服务器端,提供了一套丰富的组件和库,使得开发者能够快速构建动态的网页和网络应用。ASP.NET广泛应用于企业级的Web应用开发中,因其对开发效率的提升以及对各种开发需求的良好支持而备受欢迎。ASP.NET Web Forms 是构建动态Web应用程序的一个非常流行的框架,它通过控件的形式简化了网页开发。Web Forms控件可以分为HTML控件、Web控件和验证控件。HTML控件是最基础的控件,直接映射为HTML标签;

weixin_35835018的博客 1016

C# Web开发实战示例合集:从入门到项目部署

htmltable {th, td {th {pre {简介:本示例合集基于C#与.NET平台,结合ASP.NET技术,系统展示了电子商务平台、企业门户网站和图书管理系统的开发全过程。内容涵盖C#语言基础、ASP.NET多种开发模式(Web Forms、MVC、Web API)、数据库操作、前端界面设计及项目部署优化等关键环节。通过实际项目实践,帮助开发者掌握用户认证、购物车管理、实时通信、数据增删改查等功能的实现,全面提升C# Web应用开发能力。

weixin_42612405的博客 842

VB.NET Web开发经典教程与实例

VB.NET(Visual Basic .NET)是继VB6之后,微软推出的一款完全集成在.NET Framework中的面向对象编程语言。它保留了VB语言的简单易用特点,并加入了.NET的众多新特性,如继承、多态和异常处理。VB.NET广泛应用于Windows平台的桌面应用程序、Web服务和网站开发。VB.NET的基本语法包含了变量声明、控制流程语句、数组处理等。例如,声明一个整数变量并初始化的语法是:在控制流程方面,VB.NET支持传统的语句以及For和While循环。

weixin_42576467的博客 611

Java与新浪微博API交互的毕业设计实践

本文还有配套的精品资源,点击获取 简介:本毕业设计聚焦于通过Java语言编程实现与新浪微博API的交互。涉及内容包括理解HTTP协议、JSON数据处理、RESTful API设计、OAuth 2.0授权机制等关键网络编程技术。学生将深入学习新浪微博API的使用,以及如何通过Java SDK进行有效调用,实现诸如发布微博、获取用户信息、检索热门话题等功能。本项目旨在提高学生的...

weixin_35756690的博客 1172

深入理解C#编程与WCF服务开发

本文深入探讨了C#编程的各个方面,包括基础语法、数据类型、类和对象、集合、异常处理、LINQ数据查询以及WCF服务的创建与部署。内容涵盖了从C#基础到高级特性的全面介绍,特别是WCF服务的构建,包括如何根据CPU使用情况和用户需求扩展Web API,以及如何处理数据库连接和数据绑定。文章强调了在构建Web API时,考虑到可扩展性和性能的重要性。

weixin_32869687的博客 475

深入理解Jackson核心库2.5.0在Spring4中的应用

注解定义在属性、getter方法或类级别上。在类级别上的注解将会影响该类及其所有子类和子接口的所有属性;属性级别的注解将覆盖类级别的设置。使用时,你需要指定Include枚举值,它定义了哪些属性值应当被包含在内。在上面的例子中,只有当name和age字段非空时,它们才会被序列化。注解通常应用于字段或getter方法上,能够定义日期时间的格式。这个注解支持多种格式参数,例如patterntimezone等。在上面的代码中,Event类中的date。

weixin_42527589的博客 697

深度剖析价值99999元的Java Web项目源代码与技术资料

本文还有配套的精品资源,点击获取 简介:本资料包涉及Java Web开发的关键技术和实践,旨在构建高效、稳定、可扩展的Web应用程序。包括Java编程基础、Servlet与JSP技术、MVC设计模式、Spring框架、MyBatis持久层框架、数据库管理、Web容器使用、前端技术、AJAX、RESTful API设计、安全控制、版本控制、CI/CD自动化、单元与集成测试,以...

weixin_28931449的博客 1092

PWS:Python Web服务解算器的综合应用

本文还有配套的精品资源,点击获取 简介:PWS是一个专为Web服务任务设计的Python解析器,支持SOAP和REST协议,并提供服务发现、请求构造、响应解析、错误处理和自动化测试等核心功能。该工具适用于集成开发、API测试、数据分析和自动化脚本等多个领域,旨在简化Web服务处理流程,提高开发效率。 1. PWS定义与功能 1.1 PWS简介 PWS(Pe...

weixin_42612804的博客 2109

Eclipse Web开发教程:从基础到高级应用源码解析

自1995年由Sun Microsystems公司推出以来,Java便迅速在企业级应用和移动应用开发领域占据一席之地。Java的“一次编写,到处运行”的理念,让它在多种操作系统上拥有良好的兼容性。Java语言的发展经历了多个阶段,从JDK 1.0到最新的JDK版本,Java在语法、性能、安全性等方面不断进行改进和创新。特点分析跨平台特性:Java虚拟机(JVM)的存在使Java程序能够在不同操作系统上无差异运行。面向对象。

weixin_42510243的博客 901

JAVA Web租车系统与Mysql实践教程.zip

Java作为一种面向对象的编程语言,它的跨平台性和丰富的API库为开发者提供了极大的便利。要开始Java之旅,首先需要配置好Java开发环境。这包括安装Java Development Kit (JDK),设置环境变量,以及熟悉一些基础的IDE(如Eclipse或IntelliJ IDEA),这将帮助你创建、编译和运行Java程序。MVC设计模式的三个核心组件各有其独特作用:模型(Model):代表应用的数据结构,通常与数据库表相对应。模型直接处理与数据相关的业务逻辑和数据访问代码。

weixin_35749786的博客 323

ULN2003驱动28BYJ-48步进电机详解(附:51 32代码讲解)

本文介绍了28BYJ-48步进电机的驱动原理以及注意事项,并展示了极简 32 51驱动代码

qq_41818650的博客 1万+

不用写触发器!帆软填报报表自动记录创建/修改时间的终极方案

本文详细介绍了帆软填报报表中无需编写数据库触发器,即可自动记录数据创建时间和修改时间的终极方案。该方案利用帆软内置函数和单元格条件属性,在应用层实现日期自动生成,有效规避了触发器带来的权限、维护和部署难题,为数据填报提供了更轻量、灵活且易于维护的解决方案。

weixin_28040125的博客 359

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 423

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

深度学习(Deep Learning, DL)简介

深度学习(Deep Learning, DL)是机器学习的一个子领域,主要使用多层神经网络来处理复杂的数据和任务。深度学习通过模拟人脑的神经网络结构,能够自动提取特征并进行高效的模式识别和预测。

qq_28791753的博客 1万+

Trae+雪球MCP,化身专业的股票分析师(玩转100个MCP系列第二弹)

大家好呀,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧、经验以及前沿资讯,有兴趣的可以关注我的公众号,一起学习,共同进步。第二弹,使用Trae+雪球MCP,获取股票实时行情,分析股票走向等,写代码间隙看看股票价格,研究研究行情,哈哈。真的很不错呀,最关键的是,足够隐蔽,同事以为你在写代码,实际你在浏览股票行情,哈哈,感兴趣的可以试一下哦。说实话,沧州明珠这只股我算是砸手里了,不过还好买的不多,哈哈。

cpp加油站的专栏 518

uniapp [全端兼容] - 实现内网使用天地图离线地图,详解项目加载天地图的离线地图服务器部署与使用教程示例源码,Uniapp如何实现天地图的离线加载部署在内网访问(兼容H5、微信小程序、App)

uniapp天地图如何离线访问,无需网络调用天地图API,天地图离线地图,天地图——内网使用离线地图,uniapp中加载天地图的离线地图,uniAPP实现天地图离线访问,在内网中无法直接使用外网天地图资源怎么办,在uni-app中加载地图 -使用天地图的瓦片数据。UNIAPP天地图离线怎么使用,内网部署天地图,天地图离线瓦片,部分瓦片数据,天地图如何离线,下载天地图离线服务,并用Uniapp+天地图离线部署,天地图私有化部署,实现离线加载天地图,Java+uniapp天地图离线开发,uniapp项目中无网络

🏆 前端领域优质创作者 4900

H3C交换机命令大全,分模块好记忆!

在深入命令之前,我们先来了解H3C交换机的命令行基础。<H3C>[H3C]常用基础命令如下:这些基础命令是操作H3C交换机的敲门砖,熟练掌握后,我们将按模块深入探讨更具体的配置命令。H3C交换机的命令可以按功能模块分类,包括系统管理、接口配置、VLAN操作、链路聚合、路由配置、安全管理等。

网络技术联盟站 782

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")

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 19、异步交互系统安全与基于反向散射通信和感知的移动机器人新问题设定
下一篇: 3、深入探索Oracle WebLogic:迈向中间件世界的第一步
http9protocoller
博客等级 码龄1天 0粉丝 1782原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值