浏览器的CRUD URL设计(不是REST)

时间:2017-04-23 07:52:13

标签: web-services rest http url url-design

针对RESTful URL设计的Stack Overflow已经提出了很多问题

仅举几例......

分层网址设计: Hierarchical RESTful URL design

了解REST:动词,错误代码和身份验证:Understanding REST: Verbs, error codes, and authentication

所以我很清楚Restful URL Design。 但是,对于非单页应用程序(SPA)的传统网站,浏览器的URL设计如何。

出于本示例的目的,我们假设我们有一个图书数据库。让我们进一步假设我们创建了2个传统的HTML网站。

  1. 用于显示所有图书的HTML表格
  2. HTML表单,用于显示一本书(空白或预先填写书籍详细信息)
  3. 现在我们希望我们网站的用户可以使用它进行CRUD操作。那么以下URL设计如何:

    GET /book/show/all        // HTML Table
    GET /book/show/{id}       // HTML Form pre-filled
    GET /book/new             // HTML Form blank
    POST /book/new            // Submit HTML Form
    POST /book/update/{id}    // Submit updated HTML Form
    POST /book/delete/{id}    // A Link/Button with POST ability (no JS needed)
    

    问题:

    最佳做法浏览器网址设计

    我是否遵循浏览器中的URL设计的最佳实践(我不是在谈论REST)?关于SEO,书签和短网址设计?我想的是:/ resource / action / ...

    仅限GET和POST网址设计

    除非有人使用JavaScript,否则浏览器只能进行GET和POST。考虑到上面的URL设计,引入JavaScript并发出更新和删除资源的PUT和DELETE请求是否应该更明智?或者我应该只使用GET和POST?

    干杯

1 个答案:

答案 0 :(得分:1)

我更喜欢缩写(D)AREL(显示,添加,删除,编辑,列出),而不是CRUD(创建,读取,更新,删除)-(D)是无声的;-)

虽然并非所有RESTful API设计选择都对基于浏览器的Crud应用程序有意义,但我们可以借鉴其中的很多内容,例如:

GET  /books                -- html table listing all books (alternatively /books/list to go with the DAREL acronym)
GET  /books/add            -- display a form for adding a new book
POST /books/add            -- adds a new book and redirects to /book/1 (where 1 is a new book id)

我个人更喜欢使用复数名词来表示集合,而使用单数名词来表示集合,所以..

GET  /book/1               -- display book 1 info (e.g. a customer view)
GET  /book/1/edit          -- display a form to edit /book/1
POST /book/1/edit          -- updates /book/1 and redirects to /book/1
GET  /book/1/remove        -- maybe/probably optional
POST /book/1/remove        -- normally /book/1/edit will have a delete button that handles "are you sure..?" and posts here, redirects to /books

uri方案为/resource/unique-identifier/action。对于给定的资源uri,(D)/显示操作是静音/默认。

如果您想为一本书可以有多个作者建模,这也可以使用:

GET  /book/1/authors       -- list all authors for /book/1
GET  /book/1/authors/add   -- add author form
GET  /book/1/author/1
GET  /book/1/author/1/edit
// etc.

尽管您可能需要作者的单独/附加网址层次结构:

GET  /authors
GET  /authors/add
GET  /author/1
// etc.

以及类似地,作者写过的书:

GET  /author/1/books
// etc.

尽管大多数现代网络应用程序都将ajax调用用于子资源,所以在这里您也可以使用纯RESTful api:

GET    /api/book/1/authors     -- returns list of all authors for /book/1
POST   /api/book/1/authors     -- create a new author, returns the new author uri, e.g. /api/author/1
GET    /api/author/1           -- get /author/1 info according to MIME type etc.
PUT    /api/author/1           -- update /author/1
DELETE /api/author/1           -- delete the /author/1 resource
DELETE /api/book/1/author/1    -- delete author/1 from /book/1? (or maybe this is covered by PUT /api/author/1 ?)

原始网址格式的翻译非常机械化

/resource/unique-id/action -> http-verb /resource/unique-id

其中action = http-verb

display = GET (on a singular resource)
add = POST
remove = DELETE
edit = PUT
list = GET (on a plural/collection resource)