对于 REST 和 ASP.NET Web API,即使 DTO 负载(例如 JSON)本身指定了标识符,是否也需要将标识符添加到 PUT 操作方法的路由中?
例如:
public void Put(int id, [FromBody]SomeDto someDto) // someDto has an 'Id' property
Run Code Online (Sandbox Code Playgroud)
ASP.NET Web API 模板包含该id参数,我见过很多这样的例子。
相比之下,是否可以省略该id参数并仍然遵守 REST 准则?例如:
public void Put([FromBody]SomeDto someDto)
Run Code Online (Sandbox Code Playgroud) 我想知道当您拥有包含子资源列表的资源时哪种是最佳实践。例如,您有资源作者,其中包含姓名、ID、生日和书籍列表等信息。此图书列表仅与作者相关。所以,你有以下场景:
解决方案1
我搜索了哪个是正确的设计,发现了多种方法。我想知道是否有一个标准的设计方法。我觉得书上的设计说有以下几个方法:
POST /authors/{authorId}/book/PUT /authors/{authorId}/book/{bookId}DELETE /authors/{authorId}/book/{bookId}解决方案2
我的解决方案是只有一个 PUT 方法可以完成所有这三件事,因为书籍列表仅存在于对象作者内部,而您实际上正在更新作者。就像是:
PUT /authors/{authorId}/updateBookList(并将整个更新的书籍列表发送到作者对象内)
我发现我的场景中有多个错误。例如,从客户端发送更多数据、在客户端上有一些逻辑、对 API 进行更多验证以及依赖客户端拥有最新版本的图书列表。
我的问题是:这样做是反模式吗?
情况 1. 在我的情况下,我的 API 使用另一个 API,而不是数据库。使用的 API 只有一种“updateBookList”方法,因此我猜测在我的 API 中复制此行为也更容易。是否也正确呢?
情况 2。但是,假设我的 API 将使用数据库,那么使用解决方案 1 是否更合适?
另外,如果您可以提供一些可以找到类似信息的文章、书籍。我知道这种设计并不是一成不变的,但一些指导方针会有所帮助。(示例:摘自 REST API 设计规则手册 - Masse - O'Reilly)
例如,如果我调用GET获取项目,使用DELETE删除它并再次获取它,第二个GET应如何工作?
我的意思是,通过正确遵循REST原则,这样做的正确方法是什么,因为GET可以被缓存而且全部?在REST中处理陈旧数据的方法是什么?
在MVC 2发布之后,我开始检查并使用新功能,但我无法理解动词PUT和DELETE动词的用途.
我搜索了它并阅读了一些文章,但我无法得到它.
DELETE和的主要目的是PUT什么?它们是否比使用GET或POST方法更有优势(即使我可以使用GET和POST处理所有请求)?
我很困惑你何时以及为什么要在REST中使用特定的动词?
我知道基本的东西,比如:
Get -> for retrieval
Post -> adding new entity
PUT -> updating
Delete -> for deleting
Run Code Online (Sandbox Code Playgroud)
这些属性是按照我上面写的操作使用的,但我不明白为什么?如果在REST中的Get方法内部我会添加一个新实体或在POST内部更新一个实体会发生什么?或者可能在DELETE里面我添加一个实体.我知道这可能是一个noob问题,但我需要了解它.这对我来说听起来很混乱.
我目前正在使用GET获取有关文件的信息,如果我使用HEAD请求重写它会更快吗?原因我在第一次响应后关闭连接.
似乎ASMX隐含地不允许OPTIONS动词.我发布这个问题是因为我正在使用POST的jQuery AJAX调用,它首先在发出POST动词**之前向服务器查询可用的OPTIONS.
默认情况下,Web.config将所有谓词映射到旧版ASMX,如此部分配置示例所示,因此所有内容都应正确路由:
<system.webServer>
<requestFiltering>
<verbs>
<add verb="OPTIONS" allowed="true"/>
<add verb="GET" allowed="true"/>
<add verb="POST" allowed="true"/>
</verbs>
</requestFiltering>
<handlers>
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Run Code Online (Sandbox Code Playgroud)
但是,对于OPTIONS请求,HTTP响应始终为405.例如,给出以下请求:
OPTIONS http://localhost:35920/MarkupTransfomer.asmx HTTP/1.1
Host: localhost:35920
Access-Control-Request-Method: POST
Run Code Online (Sandbox Code Playgroud)
并始终导致:
HTTP/1.1 405 Method Not Allowed
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Run Code Online (Sandbox Code Playgroud)
jQuery AJAX调用如下所示,来自最近一篇关于使用ASMX的Encosia博客文章的推荐:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "http://localhost:35920/MarkupTransfomer.asmx",
data: "{'hi'}",
dataType: "json"
});
Run Code Online (Sandbox Code Playgroud)
**注意:我不想将客户端切换为使用GET而不是POST.
摘要问题:我是否
可以配置ASP.NET以允许ASMX固有地处理OPTIONS请求而不会出现错误?
我可以找一种方法告诉你jQuery.ajax(..)不要在POST之前发出OPTIONS动词吗?
如果我不能从传统的ASMX那里得到什么,我还考虑了另外两个潜在的想法:
System.Web.IHttpHandler,将其粘贴在web.config …对于仅让服务器发送电子邮件而不改变整个 Web 应用程序状态的请求,正确的 http 动词是什么?
我正在开发一个 Rails 项目,我需要以某种方式定义路线:
Rails.application.routes.draw do
get 'self_emailer/email_me'
...
end
Run Code Online (Sandbox Code Playgroud) 有没有办法将HTTP动词(PATCH/POST)传递给函数并动态地将该动词用于Python请求?
例如,我希望这个函数采用一个'动词'变量,该变量只在内部调用,或者= post/patch.
def dnsChange(self, zID, verb):
for record in config.NEW_DNS:
### LINE BELOW IS ALL THAT MATTERS TO THIS QUESTION
json = requests.verb(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data={"type":record[0], "name":record[1], "content":record[2]})
key = record[0] + "record with host " + record[1]
result = json.loads(json.text)
self.apiSuccess(result,key,value)
Run Code Online (Sandbox Code Playgroud)
我意识到我不能请求.如上所述''''',它的意思是说明问题.有没有办法做到这一点或类似的东西?我想避免:
if verb == 'post':
json = requests.post(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data={"type":record[0], "name":record[1], "content":record[2]}
else:
json = requests.patch(headers=self.auth, url=self.API + '/zones/' + str(zID) + '/dns_records', data={"type":record[0], "name":record[1], "content":record[2]} …Run Code Online (Sandbox Code Playgroud)