CRUD URL 为浏览器设计(不是 REST)
CRUD URL Design for Browsers (not REST)
在 Stack Overflow 上针对 RESTful URL 设计提出了很多问题
仅举几例...
分层URL设计:
Hierarchical RESTful URL design
了解 REST:动词、错误代码和身份验证:Understanding REST: Verbs, error codes, and authentication
所以我对RestfulURL设计了如指掌。
但是,URL 为非单页应用程序 (SPA) 的传统网站设计浏览器怎么样。
为了本示例的目的,假设我们有一个图书数据库。让我们进一步假设我们创建了 2 个传统 HTML 站点。
- HTML Table 用于显示所有书籍
- HTML 显示一本书的表格(空白或预先填写图书详细信息)
现在我们希望我们网站的用户可以使用它进行增删改查操作。那么下面的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设计
我是否遵循了 URL 在浏览器中设计的最佳实践(我在这里不是在谈论 REST)?还有关于 SEO、书签和简短 URL 设计?我在想类似的东西:/resource/action/ ...
仅 GET 和 POST URL 设计
除非有人使用 JavaScript,否则浏览器只能进行 GET 和 POST。考虑到上面的 URL 设计,引入 JavaScript 并发出更新和删除资源的 PUT 和 DELETE 请求是否更明智?还是我应该只使用 GET 和 POST?
干杯
而不是 CRUD (create-read-update-delete),我更喜欢首字母缩略词 (D)AREL (display, add, remove, edit, list) -- (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)/显示操作是 silent/default。
如果您想要建模一本书可以有多个作者,这也适用:
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.
尽管您可能需要 separate/additional url-hierarchy 作者:
GET /authors
GET /authors/add
GET /author/1
// etc.
同样,作者写的书:
GET /author/1/books
// etc.
虽然大多数现代 web-apps 使用 ajax 调用 sub-resources,所以在这里您也可以使用纯 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 ?)
原文url-scheme的翻译非常机械
/resource/unique-id/action -> http-verb /resource/unique-id
其中操作 = http-verb
display = GET (on a singular resource)
add = POST
remove = DELETE
edit = PUT
list = GET (on a plural/collection resource)
在 Stack Overflow 上针对 RESTful URL 设计提出了很多问题
仅举几例...
分层URL设计: Hierarchical RESTful URL design
了解 REST:动词、错误代码和身份验证:Understanding REST: Verbs, error codes, and authentication
所以我对RestfulURL设计了如指掌。 但是,URL 为非单页应用程序 (SPA) 的传统网站设计浏览器怎么样。
为了本示例的目的,假设我们有一个图书数据库。让我们进一步假设我们创建了 2 个传统 HTML 站点。
- HTML Table 用于显示所有书籍
- HTML 显示一本书的表格(空白或预先填写图书详细信息)
现在我们希望我们网站的用户可以使用它进行增删改查操作。那么下面的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设计
我是否遵循了 URL 在浏览器中设计的最佳实践(我在这里不是在谈论 REST)?还有关于 SEO、书签和简短 URL 设计?我在想类似的东西:/resource/action/ ...
仅GET 和 POST URL 设计
除非有人使用 JavaScript,否则浏览器只能进行 GET 和 POST。考虑到上面的 URL 设计,引入 JavaScript 并发出更新和删除资源的 PUT 和 DELETE 请求是否更明智?还是我应该只使用 GET 和 POST?
干杯
而不是 CRUD (create-read-update-delete),我更喜欢首字母缩略词 (D)AREL (display, add, remove, edit, list) -- (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)/显示操作是 silent/default。
如果您想要建模一本书可以有多个作者,这也适用:
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.
尽管您可能需要 separate/additional url-hierarchy 作者:
GET /authors
GET /authors/add
GET /author/1
// etc.
同样,作者写的书:
GET /author/1/books
// etc.
虽然大多数现代 web-apps 使用 ajax 调用 sub-resources,所以在这里您也可以使用纯 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 ?)
原文url-scheme的翻译非常机械
/resource/unique-id/action -> http-verb /resource/unique-id
其中操作 = http-verb
display = GET (on a singular resource)
add = POST
remove = DELETE
edit = PUT
list = GET (on a plural/collection resource)