在RESTful html应用程序中,在何处放置表单/备选视图?

在RESTful html应用程序中,在何处放置表单/备选视图?,html,forms,rest,Html,Forms,Rest,让我们假设一个web应用程序,它为每个URI提供了一个用于GET请求的漂亮html视图,并允许通过POST/PUT/PATCH/任何方式更新底层资源 然后,如何公开允许从浏览器执行此类请求的各种表单?更广泛的是:假设我对同一资源有其他视图(可能还有HTML),我应该把它们放在哪里?可以说,这种形式可以被视为替代观点,因此对更广泛的问题有一个答案将是理想的 编辑:澄清一下,我的问题不是关于服务JSON或诸如此类的纯数据API,而是关于诸如Stackoverflow之类的HTML应用程序。例如,您

让我们假设一个web应用程序,它为每个URI提供了一个用于GET请求的漂亮html视图,并允许通过POST/PUT/PATCH/任何方式更新底层资源

然后,如何公开允许从浏览器执行此类请求的各种表单?更广泛的是:假设我对同一资源有其他视图(可能还有HTML),我应该把它们放在哪里?可以说,这种形式可以被视为替代观点,因此对更广泛的问题有一个答案将是理想的



编辑:澄清一下,我的问题不是关于服务JSON或诸如此类的纯数据API,而是关于诸如Stackoverflow之类的HTML应用程序。例如,您可以获得下面的问题集合,以及这个特定的问题集合。要获得添加新问题的表单,您必须使用,我不确定这是否正确。这张表贴到了,这似乎完全错了。向该URL发出GET请求会产生404(如果有任何变化,则应该是405)。表格应张贴到
/问题
。我仍然想知道,在RESTful系统中,表单的URI是否被认为是可接受的。

在100%RESTful Web服务中,资源是使用描述性URL来标识的,即仅由名词短语组成的URL


一般来说,为了创建新资源,您会使用
PUT
,尽管有些框架(如Zend Framework 2,如果我记得很清楚的话)会使用
POST
。因此,对于创建问题,您可以
提出问题
,然后在请求主体中提供问题标识符,或者
提出问题/{identifier}
,从而在URL中提供id。

这是我自己遇到的问题,我认为没有正确的答案

假设我有一个公开
/people/:id
的API,我通常会为
/people/new
保留一个端点。使用
Accept:text/html
对该url的
GET
请求将返回一个表单进行创建,但其他任何操作都将抛出404,因为此页面仅适用于web浏览器中的用户。然后,该页面上的表单将按照您的预期发布到
/people/

类似地,如果有人想要编辑现有的人,那么可以从
/people/1/update
,或者仅从HTML提供要编辑的表单


如果您的API具有这种结构,那么我认为保留诸如
new
update
之类的关键字是完全合理的。

REst的本质不是URL的外观,而是如何使用http谓词和头来传输数据

整个“restfull URL”是由不了解Rest是什么的人编造的。Rest规范所说的就是URL必须是唯一的

现在,如果您真的想要“restfull”表单,那么表单应该是一个id为的资源,如/form/2929929。当然,这样做没有意义,因为表单严格面向web用户,REst不关心数据的获取方式,只关心数据的传输方式


简而言之,选择你想要的URL。一些框架对表单使用new和update。顺便说一句,/questions/ask/submit在Rest上下文中是完全有效的,因为您提交的内容和一个问题可能是两种完全不同的资源。

据我所知,您需要的应用程序是:

  • 显示HTML页面(最终显示其他格式?)
  • 显示用于创建新元素或更新现有元素的表单视图
  • 接受带有url编码数据的POST/PUT(通过提交上述表单发送),以创建或更新这些元素(以及最终的其他格式?)
RubyonRails是一个针对这种需求的框架。摘自指南:

您可以拥有操作索引、新建、显示和编辑的HTML视图

我个人建议补充以下内容:

POST       /photos/:id        update    update a specific photo
POST       /photos/:id/delete destroy   delete a specific photo
因此,通过html表单更新或删除元素会更简单

所有这些路径都只是Rails惯例,并不是REST强加的,但它给出了一个清晰的示例,说明了可以做什么

但是,使用其他框架按照相同或略有不同的约定创建应用程序是非常容易的。Java+Spring MVC可以很容易地做到这一点,使用JSP、Velocity、Thymeleaf或其他工具的HTML视图,以及在输入或输出中使用JSON的可能性,只需使用URL中的HTTP头或后缀(
GET/photos/:id.JSON
),与RoR相比,它的魔力更小,但控制力更强。我不是Struts2(仍然是Java)或Django(Python)等其他框架的专家,但我非常确信这也是可能的

重要的是:

  • 选择一种语言(Ruby、Python、Java、PHP、ASP.NET等)
  • 选择与RESTfull URL兼容的框架
  • 确保您可以拥有HTML或JSON格式的视图,或者通过添加后缀或HTTP头并最终添加适当的适配器/转换器来输入所需的格式

您可以手工操作,但框架限制了模板代码。

您需要了解RESTfull应用程序和REST客户端之间的区别

RESTfull应用程序具有您描述的纯RESTfull URL,例如

GET     /persons   : gets a list of all the persons in database
POST    /persons   : adds a new person
GET     /person/1  : gets a person with id 1
PUT     /person/1  : updates person with id 1
DELETE  /person/1  : deletes person with id 1
等等

这样的应用程序没有用于提交数据的任何表单或UI。它仅通过HTTP请求接受数据。要使用这样的应用程序,您可以使用诸如curl之类的工具发送和接收数据,甚至您的浏览器,它们允许您发出HTTP请求

现在,从用户的角度来看,这样的应用程序显然是不可用的。因此,我们需要创建使用这些restfull应用程序的客户机应用程序。这些客户端根本不是restfull,它们的URL如下:

GET     /person/showall  : displays a list of all persons
GET     /person/create   : shows new person form
POST    /person/create   : submits the data to the restfull application via ajax or simillar technology.
等等

这些客户端可以是另一个HTML应用程序、android应用程序、iOS应用程序等

你想在这里做什么
GET     /person/showall  : displays a list of all persons
GET     /person/create   : shows new person form
POST    /person/create   : submits the data to the restfull application via ajax or simillar technology.
GET api.domain/questions - Retrieves a list of tickets   
GET api.domain/questions/12 - Retrieves a specific ticket   
POST api.domain/questions - Creates a new ticket  
PUT api.domain/questions/12 - Updates ticket #12  
DELETE api.domain/questions/12 - Deletes ticket #12  
PATCH api.domain/questions/12 - Partially updates ticket #12 #I only want to display that this also exists - i don't really use it...   
       URL           REQUEST       ACCEPT HEADER               RESPONSE                      
-----------------------------------------------------------------------------------------
domain/questions      GET        application/json   all questions as json
domain/questions      GET        text/html          the page as html with all questions
domain/questions/ask  GET        text/html          Your html for to add a new question
domain/questions      POST       application/json   Add a new new questions (this would be called from ./ask to add the new questions
domain/questions/ask  GET        application/json   404 Status-Code because on questions/ask you don't have implemented any resource
       URL              REQUEST     ACCEPT HEADER               RESPONSE                      
-----------------------------------------------------------------------------------------
domain/questions/12       GET      application/json   Shows the questions with the ID 12 as JSON
domain/questions/12       GET      text/html          Shows the HTML representation of your page
domain/questions/12/edit  GET      text/html          Your html for to edit a the question
domain/questions/12       PUT      application/json   Updates the questions with the ID 12 // just to add the PATCH thing.. i don't really use it but if you don't update the whole object you could/should use PATCH instead of PUT :p
domain/questions/12/edit  GET      application/json   404 Status-Code because on questions/ask you don't have implemented any resource
GET /profile/{id}  would be called to pre-populate a profile FORM

PUT /profile/{id}  would be called to update the profile