2

我的问题与标题中提到的完全一样。我有 Spring webservices 返回 JSON 响应。以下哪一项是处理错误的优雅方式:

  1. 从 Spring MVC 控制器抛出一个异常,然后由 jQuery 的错误函数处理。

  2. 发送 JSON 响应设置,例如。result="failure" 然后在jquery的success函数中,检查'result'的值

    我想了解这两种方法的优缺点。

谢谢

4

2 回答 2

8

success通过 a或其他类似标志报告请求处理中的错误是开发 Web 服务的标准做法。也就是说,如果您的请求成功,则 JSON 响应中的该标志指示success,否则指示failure。如果请求成功,您的 JSON 响应中可能还有其他properties可以携带适当消息的字段,以及可以携带您的结果数据的另一个字段。

当您以这种方式开发服务时,您的 Web 服务的使用者不再依赖于自定义异常处理。使用您的第一种方法,他们必须自己解释HTTP代码并据此确定行动方案。这总是会导致客户端出现大量错误处理代码(可能在使用服务的任何地方重复)。相反,通过一个简单的错误标志,他们可以只检查标志并确定请求是否成功,并显示适当的消息或采取其他行动。

我曾参与处理一些 Web 服务(开发和消费),但我从未处理过依赖于errorAjax 调用处理程序的 Web 服务。

第一种方法的优点是您现在可以真正将成功的请求与不成功的请求区分开来。但是,在这种情况下,请确保您自己在服务器端处理这些异常,并根据这些异常返回适当的状态代码。如果您不这样做,大多数异常将导致HTTP错误代码,500并且您的 Web 服务客户端可能很难以某种通用方式对其进行解释。

有关在 API 中处理错误的正确方法的小讨论,请参见此处

于 2013-05-31T08:40:57.150 回答
0
function addCustomer(){
      $.post( "customer/addCustomer", addCustomerForm.serialize() )
     .done(function(data) {
         if(data==='OK'){
             alert( "Customer saved");
         }else{
             alert(data);
         }
      }).fail( function(xhr, textStatus, errorThrown) {
         alert(textStatus + ":" + errorThrown);
      });
 }

 @RequestMapping(value = "addCustomer", method = RequestMethod.POST)
public  @ResponseBody String addCustomer(

        @RequestParam(required = true, value="add-customer-name") String customerName,
        @RequestParam(required = true, value="add-customer-city-name") String customerCity,
        @RequestParam(required = true, value="add-customer-distributer") String distributerNodeName,
        @RequestParam(required = true, value="add-customer-accountid") String accountId

    ){

    try{

        customersDao.createCustomer(customerName,customerCity, distributerNodeName, accountId);

    }catch(SQLException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(AlreadyExistsException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(QuoteLimitException e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }catch(Exception e){
        logger.error("create customer failed", e);
        return "error:"+e.getMessage();
    }

    return "OK";
}
于 2014-09-10T07:57:16.257 回答