【问题标题】:REST/JSON/MVC Return ValuesREST/JSON/MVC 返回值
【发布时间】:2011-05-25 15:56:58
【问题描述】:

不是一个很好的标题,但我正在寻找更多的指导,已经搜索了很多。我正在使用 MVC 框架构建一个 Web 应用程序(但我认为这是一个更通用的问题)。我正在尝试制作许多执行大量 AJAX 样式调用的视图,并说我有一个带有用户的站点,他们可以将文件夹和文件添加到他们的个人资料页面。所以 URL 可能是这样的:

/profile/{id}

我有一个 Profile 控制器,它返回一个包含各种信息的视图。我希望配置文件中列出的文件和文件夹是动态的,因此我想通过 AJAX 调用填充它。我在想我会有一个类似的网址

/listFolders/{userId}

/listFiles/{folderId}

让这些 URL 为这两个 URL 返回一个 JSON 对象,甚至不提供 HTML 视图是否合理(因为对于浏览器,视图将只是整个配置文件页面)?另外,如果用户/文件夹不存在或当前登录的用户无权访问数据,我应该返回什么错误?仅设置 404 或 403 HTTP 错误代码是否合理,或者它们是否需要返回某种 HTML?如果有多种原因导致它失败并且我想传递它怎么办?我应该任意选择 HTTP 错误代码还是定义整数返回代码,如 0、1、2 等?另外,URL 是否应该指定它们是 JSON,例如 listFoldersJSON 而不是 listFolders

【问题讨论】:

    标签: json model-view-controller web-applications rest


    【解决方案1】:

    我在以前的项目中使用过 JSON。对于错误,我们返回错误代码。

    我们决定这样做是因为我们正在处理 API 客户端。所以我们要处理错误码(REST是基于HTTP的,所以返回错误码是合适的)。

    由于您正在编写自己的应用程序,因此您几乎可以选择将错误发送到视图的方式。您可以创建一个错误的 json 对象,并在视图中检查该对象是否不为空。

    视图中几乎是if-else。否则,您可以在将 JSON 呈现为您想要的任何视图之前返回错误代码并检查代码。

    我会使用错误代码,因为这符合 REST 理念。

    【讨论】:

    • 您是在谈论 HTTP 错误代码(如 404、403 等)还是用户定义的错误代码,如 0、1、2 等?感谢您的回复!
    【解决方案2】:

    一般来说,我通过抛出 500 内部服务器错误和状态消息来处理这种情况。大多数客户端库(如 jQuery)都提供内置错误处理,并带有如下故障回调:

    jQuery.ajax({
        success:function(response){
            //do some success stuff
       },
       error:function (xhr, ajaxOptions, thrownError){                   
            //handle error
            alert(xhr.responseText);
            }    
    });
    

    【讨论】:

      【解决方案3】:

      返回 JSON 对象而不是实际视图是完全可行的。

      就 url 而言,您可以使用 listFolders 和 listFiles 而无需使用 JSON。但是,为了服务器的设置,我建议您使用小写的 url。例如,我知道在 Apache 上有时 listFiles 会很好,但 listfiles 会导致缺少页面异常。

      关于错误:您可以在 JSON 响应中设置各种标头并使用您喜欢的任何系统。例如,您可以执行类似的操作

      status_code: 0 //where 0 means successful
      status_detail:success!
      

      如果 status_code 不是 0,您将检查 status_detail 并知道忽略响应中的所有其他内容。

      【讨论】:

        【解决方案4】:

        另外,如果用户/文件夹不存在或当前登录的用户无权访问数据,我应该返回什么错误?

        这些是基本的 HTTP 错误代码:

        • 401:未经授权
        • 404:未找到

        HTTP 规范中有大量错误消息: HTTP Status Code Definitions


        另外,URL 是否应该指定它们是 JSON,例如 listFoldersJSON 而不是 listFolders?

        一般来说,处理此问题的一个好方法是让客户端将“接受”标头设置为“文本/json”或“文本/xml”之类的内容,并让服务器将其解析出来并以正确的响应进行响应.这样,您可以使用相同的 URL,但发回不同的数据视图(如果您愿意的话)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-05
          • 1970-01-01
          • 2019-03-10
          • 2011-06-21
          • 1970-01-01
          • 2019-08-19
          • 1970-01-01
          • 2019-06-06
          相关资源
          最近更新 更多