设计Web应用程序REST API以保存状态

时间:2017-05-18 13:33:38

标签: java web-services rest web-applications api-design

我必须设计 REST API 来保存我的Web应用程序的状态。 我的Web应用程序可能包含多个Web流,每个Web流可能包含多个页面。所以,我需要一个可以逐页保存/检索数据的API。

设计端点的方法很少:

1) /app/{app_name}/webflow/{flow_name}/page/{page_name}   
    Request Body : application/x-www-form-urlencoded
    page_data : {...json ..}
    page_data_type : JSON -- define the page data type

2) /app/{app_name}/webflow/{flow_name}?page={page_name}   
    Request Body : application/x-www-form-urlencoded
    page_data : {...json ..}
    page_data_type : JSON ---- define the page data type

3)/app/webflow/page/
    Request Body : application/x-www-form-urlencoded
    app_name : text
    flow_name : text
    page_name : text
    page_data : {...json ..}
    page_data_type : JSON -- define the page data type

4) All the above 3 ways but to remove app from the uri      
       and add it to the request parameters.

最合适的设计方法是什么?

4 个答案:

答案 0 :(得分:0)

由于将所有标识资源数据的所有内容都放到URL并且资源的所有详细信息数据仅用于有效负载被认为是一种良好做法,第一个选项似乎是最佳方法。

答案 1 :(得分:0)

如果您需要在Webflow的上下文之外访问这些页面,我建议使用两个URL(假设您将其作为REST样式API使用)

/app/{app_name}/webflow/{flow_id}

/app/{app_name}/page/{page_id}

这样,您可以独立于Web流更改页面。

每个页面都可以返回其参与的Web流的URL列表,每个Web流都可以返回其当前页面集的URL列表。

这也打开了在一个请求中执行移动操作的功能,即对概念上包含子项的项目的更新。

 GET /app/app_1/webflow/flow_1
    (content) Pages = [ page_1, page_2, page_5 ];

 POST /app/app_1/webflow/flow_1 
    (content) Pages = [ page_1, page_4, page_5 ];

 GET /app/app_1/webflow/flow_1
    (content) Pages = [ page_1, page_4, page_5 ];

使用您当前的方法,移动只能通过两个后续调用执行

 GET /app/app_1/webflow/flow_1
    (content) Pages = [ page_1, page_2, page_5 ];

 DELETE /app/app_1/webflow/flow_1/pages/page_2

 PUT /app/app_1/webflow/flow_1/pages/page_4

 (and I don't even know where to specify the ordering)

请记住,这是API。它只是使数据可访问的一种手段。不要试图让API过于紧密地反映底层数据结构。如果您明确地进行绑定,有时您会发现自己处于底层数据结构无法轻松更新的情况,因为它会在API中产生大量复杂情况。

最后,如果有意义的话,你可能想考虑用{app_name}做同样的事情。

答案 2 :(得分:0)

您通常希望提供“可发现性” - 这意味着您希望能够浏览树。例如,/app/{app_name}/webflow/应列出所有网络流,/app/{app_name}/webflow/{flow_name}/page应列出所有网页等。

强烈建议选项1更好 - 从整体上遵循该URL结构更合乎逻辑。

答案 3 :(得分:0)

由于您的“'页面'与资源有直接关系,所以它应该在路径中,所以第一个是最好的方法。