2014-02-21 45 views
0

我正在构建一个简单的RESTful服务,并试图提出良好的设计和直观的端点。这些是我在阅读了一堆关于REST的文章后想到的一些想法,并希望得到一些反馈。RESTful web服务的良好端点

将由服务被暴露的资源是书籍 - 为每个端点

http://myapp.com/books/?type=fiction&age=15-35&author=american 
http://myapp.com/books/35/chapters/2 
http://myapp.com/books/35/chapters/2/pages/6 
http://myapp.com/books/35/chapters/2/pictures/1 

响应表示将取决于该方法和Accept报头即

GET -H“接受:应用/ JSON 'http://myapp.com/books/35/chapters/2'应导致 像

{ 
    "book": "The Adventures Of Huckleberry Finn", 
    "title": "The Boys Escape Jim", 
    "pages": 15, 
    "pictures": 3 
} 

,并' 接受了同样的要求:APPLI阳离子/ xml'会返回我一个相同的xml表示。

夫妇的事情,我并不清楚:

由于REST决定了我们应该用名词,动词不是,我怎么暴露的HTML表单输入新的资源呢?

/new或/ add根本不是RESTful。

GET 'Accept: text/html' 'http://myapp.com/books/new' 

是作为一个端点到表单页面能够接受的方式?或者也许

POST 'Accept: text/html' 'http://myapp.com/books/' 

与空身体是一个更好的方法?同一个POST与一个空身体和

'Accept: application/json' 

将最终与HTTP 400错误。这是一种正确/合理的方法,还是有更好的方法来做到这一点?

我将此作为一种“暴露书籍,章节,图像的服务”资源来接近,而“网页”只是这些资源的表示之一。所以,从技术上讲,如果我在任何提到的请求中加入“Accept:text/html”,我应该期望得到所请求资源的html表示。同时,html实际上不是一种描述语言的数据,而是一种表示语言,并且在关注点分离之后,建议将模型(资源)和控制器(处理请求的代码)与视图(html)分开。

一般来说,暴露资源的'api'应该与UI分开处理吗?
如果它是一个小型的单页面应用程序会怎么样?

感谢您提前提供的所有帮助!

回答

0

你在这里问了很多问题。我只会加我2美分。您在帖子开头展示的Restful API看起来不错。你提到的那些“名词”是你的资源的名字,比如书籍,章节,页面等等.REST的想法围绕着使用HTTP动词来与这些资源进行交互。 GET请求将获取这些资源。 PUT/POST将插入或更新这些资源,DELETE将删除资源。

换句话说:

GET http://myapp.com/books/35

会拿书与35号,但

POST http://myapp.com/books/

将采用插入一个新的书到后台存储任何您提供的后期主体代表该图书的数据。

希望可以帮到...

+0

谢谢。这基本上是我的过程。我试图回答的问题是关于端点的问题。为了让POST添加一本书,客户需要知道必要的字段等。对于通过html表单完成的人类。所以我试图想出一个很好的RESTful uri。现在我倾向于做http://myapp.com/books/new,其中'新'可以被认为是一个特殊的书籍ID,表明需要向客户呈现表格。 – user3326384

+0

我想你错过了我的观点。该网址不应该改变。它应该是一个包含书籍数据的正文的myapp.com/books的POST。你的服务器应该看到一个POST进来,知道它需要创建一本新书。通常,服务器会返回已保存的资源,或者仅返回其新生成的ID。 – jgitter

+0

我明白,但我的问题是关于POST之前发生的事情。有人填写并提交表单(在这个例子中,我正在谈论一个人与一个web应用程序交互)时发生与身体POST。为了提交表格,它必须呈现给用户。这样做的一种方法是将单独的页面book_form.html(我在这里简化了它)与form method =“POST”action =“http://myapp.com/books”。然后客户端可以获取http://myapp.com/book_form.html,填写它,然后执行POST。 – user3326384