Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设计web应用程序REST API以保存状态_Java_Web Services_Rest_Web Applications_Api Design - Fatal编程技术网

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

Java 设计web应用程序REST API以保存状态,java,web-services,rest,web-applications,api-design,Java,Web Services,Rest,Web Applications,Api Design,我必须设计restapi来保存我的web应用程序的状态。 我的web应用程序可能包含多个webflow,每个webflow可能包含多个页面。因此,我需要一个API,可以保存/检索数据逐页 设计端点的方法很少: 1) /app/{app_name}/webflow/{flow_name}/page/{page_name} Request Body : application/x-www-form-urlencoded page_data : {...json ..}

我必须设计restapi来保存我的web应用程序的状态。 我的web应用程序可能包含多个webflow,每个webflow可能包含多个页面。因此,我需要一个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.

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

因为将所有识别资源的数据放在URL中,将资源的所有细节数据放在有效负载中被认为是一种良好的做法,第一个选项似乎是最好的方法。

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

通过这种方式,您可以独立于webflow更改页面

每个页面都可以向其参与的webflow返回URL列表,每个webflow都可以向其当前页面集合返回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中造成大量复杂情况


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

你通常想要传递“发现性”——这意味着你希望能够浏览树。例如,

/app/{app\u name}/webflow/
应列出所有webflow,
/app/{app\u name}/webflow/{flow\u name}/page
应列出所有页面等


这有力地表明,选项1更好——始终遵循URL结构更符合逻辑

因为你的“页面”与资源有直接关系,所以它应该在路径中,所以第一个是最好的方法。

你能解释一下它如何比选项1更好吗?我指的是选项1,更新了我的答案。当谈到#2时,我建议避免这样的方法,因为实际上它也是有效负载,在
之后放置的内容。如何获取给定webflow的页面详细信息?@VineetSingla HTTP获取webflow,查看其返回值。它包含详细说明页面的数据结构。然后HTTP获取每个页面的详细信息。
 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)