为了尊重REST原则的最佳实践,最好是在POST/PUT上返回创建/更新的实体吗?或者使用Location标头返回一个空的HTTP主体?
更确切地说,当POST创建资源时,我们应该返回:
当资源由PUT更新时,我们应该返回:
我检查了Boehm GC.用于C/C++的GC.
我知道标记和扫描算法.我很好奇的是它如何只在整个C内存中获取指针.我对C内存的理解只是一个普通的字节数组.是否有可能确定内存中的值是否为指针?
根据REST原则,我知道服务器的所有POST都应该用于创建资源; 修改服务器上的内容.如果要获取信息,请使用GET.
但是,您需要发送大量信息以获取资源的情况呢?
例如,复杂的搜索参数对于URL来说太长了.或者,假设您想要发送要搜索的图像,例如OCR或类似的图像比较.
在这些情况下,似乎有必要将数据POST到服务器,但结果不会是变化,只是信息.POST图像,接收服务器上存在的类似图像的列表.
我不想构建违反这些原则的REST API,除非它们实际上不是违规行为.
编辑
到目前为止,似乎所有答案都是正确的(!):Sergio和Kay对于在需要时"弯曲规则"的实际价值是正确的.但uriDium有一个好点:
图像上传实际上导致服务器发生变化:有一个新文件,虽然是暂时的.可以将复杂搜索视为"文档".
我想我们可以考虑"短暂的"变化的概念,"短暂的POST",其中服务器被更改并产生新的短暂资源.在这种情况下,对于RESTful考虑因素,可能这可能是以下行为:
我会考虑用第2步的完整短暂资源做出回应并在那里结束互动,只是为了反叛:-)
编辑:修复了几个语法和一致性问题,使代码更加明显,接近我实际做的事情.
我有一些看起来像这样的代码:
SomeClass someClass;
var finalResult =
DoSomething(() =>
{
var result = SomeThingHappensHere();
someClass = result.Data;
return result;
})
.DoSomething(() => return SomeOtherThingHappensHere(someClass))
.DoSomething(() => return AndYetAnotherThing())
.DoSomething(() => return AndOneMoreThing(someClass))
.Result;
HandleTheFinalResultHere(finalResult);
Run Code Online (Sandbox Code Playgroud)
其中DoSomething方法是扩展方法,并且它期望传递给它的Func.因此,每个DoSomething => lambda中的每个方法调用都返回一个Result类型.
这类似于一个可能的monad.除了检查空值,我检查Result类的状态,并调用传递给DoSomething的Func或返回前一个Result而不调用Func
我面临的问题是希望在我的代码中使用这种组合,但我还需要能够将一个组合调用结果中的数据传递给另一个调用结果,正如您可以看到的那样someClass.
我的问题不是这在技术上是否正确......我知道这是有效的,因为我现在正在这样做.我的问题是这是否是滥用闭包,命令查询分离或任何其他原则......然后询问有什么更好的模式来处理这种情况,因为我很确定我是现在,这种类型的代码陷入了"闪亮的新锤子"模式.
c# closures anti-patterns principles command-query-separation
我不太明白有一个标题; 它似乎违反了DRY原则!标题中的所有信息都(可以)包含在实现中.
在丰田生产线上,他们总是知道零件的走向.正因如此,他们可以确定他们可以解决出错的问题.这也适用于软件吗?
所有错误消息都应该告诉我他们走过的路径.有些人,带有堆栈跟踪的错误消息.这是正确的解释吗?它可以用在其他地方吗?
好的,这是播客.我认为这很有意思
我正在阅读鲍勃·马丁的OOD原则,特别是SRP文本,我理解它说的很好的精神,但我不太明白一个特定的措辞,从链接的第2页(本书的第150页) ):
我解释说:
将这两个职责分成不同的类非常重要,因为每个职责都是变革的轴心.
这里的"变化轴"究竟是什么意思?
我试图掌握整个TDD方法,因此,我真的不知道如何将其作为一个很简洁的问题来呈现,所以这里是冗长的版本.我似乎正在经历保龄球(马丁),钱(羽毛)和其他类似的游戏/简单示例和功能齐全的企业应用程序之间的差距.
我试图弄清楚我是否遗漏了类似功能概念的东西,据我所知,这是增加商业价值的东西,或者在做TDD时如何正确地分离问题以及每种方法如何适用于另一个.如果对功能的定义是一个很难的规则,那么记录和错误报告等功能就不是特征.这是否意味着TDD不提供记录和通知的方法?
不是试图开始任何战争,我很确定事实并非如此,所以我告诉自己"商业价值"必须将中间应用从客户业务价值转移到业务(应用的创建者)业务价值.
所以我然后尝试将其切换为这个常见示例From:作为数学白痴当我输入2时,按add,输入2,然后按=我想要4返回.
要:作为监视系统的系统分析员当用户输入导致未处理错误的函数时,我想要应用程序的当前状态,抛出异常并将堆栈跟踪输入到日志中并向系统分析员分发列表发送电子邮件.
然后:作为业务分析师确保所有客户订单得到处理当用户提交电子订单并且路由或会计信息未验证时,我希望将无效的会计和路由信息输入到日志中并通过电子邮件发送附带的订单文件业务分析师用户组.除非问题是因为无法访问数据库以查找由于网络问题导致的客户信息,请输入"无法访问数据库以查找由于网络问题导致的客户信息",并将错误消息发送到系统分析师分发清单.
然后开始扩展到我认为完全不可接受的东西:作为电子订单完成检查当收到订单时,我想检查x12文件是否被翻译成平面文件,如果它未通过验证或翻译日志并通过电子邮件发送错误,则提取订单信息和状态并将其加载到数据库中文件被发送到队列到as400并且状态更新到数据库as400发送确认他们收到订单并且状态更新到数据库as400发送一个flatfile确认并且状态更新到数据库确认转换为x12并且状态更新到数据库,x12确认被正确路由,状态更新到数据库,确认发送到数据库客户和状态更新到数据库如果x12包含无效数据记录错误,发送电子邮件,如果平板文件没有在2分钟内拉出队列记录错误,发送电子邮件等n与x电源可能的错误情况.
即使您将每个功能分解为自己的"功能",您仍然会遇到日志问题,通知系统分析员应用程序发生异常或发生网络错误或找不到数据库等,或者业务组发现具有无法识别的帐号的订单是将这些中的任何一个添加到类中,作为方法,属性等似乎违反了单一责任原则.大约那个时候事情开始旋转,我头晕,气短和心悸
所以,既然我对此感到困惑,以至于我不知道如何将其作为一个清晰的问题,我会试着总结一下.
你如何确定何时/何地以及如何分解这些东西并将它们分开?很容易说将它们分解成提供商业价值的最小部分,但是当你不能拥有一件没有其他部分时,那么"真正的"答案是什么?所有这些都不适合一个粘性.
我愿意接受包含更多书籍,教程和视频的答案,但我认为,如果有一些真实世界的应用程序可以解释这些类型的东西,这些应用程序遵循可能提供最大价值的敏捷和TDD原则?不可否认,我对此比较陌生,但我已经阅读了Martin/Feathers/Osherove的书籍,我看过很多关于井字游戏,保龄球,素数等的katas,但是没有记录,没有错误报告没有这种"现实世界"的东西.
让我尝试别的.
我通过ftp从大型机获取一个文件,列出要与我们的供应商一起下的订单,这个文件称为摘要文件.我每5分钟检查一次这个文件.当有一个文件我解析它然后检查以确保我们通过MQ收到了这个摘要文件中列出的每个订单.作为双重检查,我还检查订单是否存在,因为如果未收到摘要文件,我们无法确保收到所有订单.有了这样说,以下看起来似乎我朝着正确的方向前进?
Feature: Check for the presence of a summary file
In order to verify all orders were sent through MQ from the mainframe
a summary file must be found to determine the expected orders.
Scenario: A summary file has not been sent
Given a summary file does not exist
When I check for the existence of a file
Then I should sleep for 5 minutes
Scenario: A summary …Run Code Online (Sandbox Code Playgroud) 是否有将类组织到命名空间的原则?
例如,如果来自命名空间N的类依赖于来自NX的类,那么它是否可以?如果来自NX的类依赖于来自N的类?
principles ×10
c ×2
c# ×2
rest ×2
.net ×1
bdd ×1
boehm-gc ×1
c++ ×1
closures ×1
crud ×1
header ×1
methods ×1
oop ×1
process ×1
single-responsibility-principle ×1
storyboard ×1
tdd ×1
unit-testing ×1
web-services ×1
wording ×1