Java:REST服务中的异常和返回值处理消耗

时间:2016-08-14 10:17:28

标签: java rest exception

我正在调用一个返回JSON字符串的REST服务。它有效,但我不确定如何处理异常和返回值。以下是我写的两种方法:

public static String callRestService(String id) {

    try {
        URL url = new URL("http://"localhost:8080/rest/api/2/issue/" + id);
        String basicAuth = ConnectionHelper.getServerAuthentication(serverConfig.get("authenticationType"),
            serverConfig.get("username"), serverConfig.get("password"));
        HttpURLConnection connection = ConnectionHelper.getHttpURLConnection(url, "GET", "Accept", basicAuth);

        if (connection != null) {
            InputStream responseStream = connection.getInputStream();
            String response = StringHelper.convertInputStreamToString(responseStream);
            connection.disconnect();

            return response;
        }
        return "";

    } catch (Exception e) {
        return "";
    }
}

    public static HttpURLConnection getHttpURLConnection(URL url, String requestMethod, String requestProperty,
    String authentication) {

    try {
        HttpURLConnection connection = (HttpURLConnection)url.openConnection();

        if (authentication != null && !authentication.isEmpty()) {
            connection.addRequestProperty("Authorization", authentication);
        }
        connection.setRequestMethod(requestMethod);
        connection.addRequestProperty(requestProperty, "application/json");

        return connection;
    } catch (Exception e) {
        return null;
    }
}

我的返回值和异常处理是否正常?或者有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

如果它是正确的REST服务,它将在http响应代码中添加有关呼叫的其他信息。因此,如果它不以2开头,则根本没有解析响应体(如果没有合同在体内返回错误细节)。

如何处理异常在很大程度上取决于您当前的应用程序。一般经验法则是:

  1. 记录例外
  2. 将它们处理到适当的水平
  3. 有时候你需要确保封装并在它们发生的地方处理它们,有时可以重新抛出它们在全局捕获它们。例如。您正在使用类似JSF的框架,用户已触发外部服务调用,记录异常,重新抛出,捕获它并在不共享太多技术细节的情况下通知用户。像:

      

    错误:发生了YOUR_ERROR_CODE。请联系技术支持   如果这种情况持续发生。

    示例:

    if (connection.getResponseCode().startsWith("2") {
    // do stuff
    // if any checked exception occurs here, add it to throws clause and let the caller catch it
    }
    else if connection.getResponseCode().equals("404") {
      throw new EntityNotFoundRuntimeException(...);
    }
    ...
    

    但是这个解决方案是否适合您的情况取决于您的架构。

答案 1 :(得分:1)

为了更好地处理客户端,您应该有Enum返回案例 例如,如果我们要构建一个注册模块,您的枚举应该如下所示:

 public enum RestResponseEnum{
    DONE(1,"done"),DUPLICATE_RECORD(2,"Sorry this is a duplicate record"),ERROR(3,"There is an error happened")
    //Getter & Setter
    private int code;
    //Getter & Setter
    private String msg;

private(int code,String msg){
          this.code=code;
          this.msg=msg;
}


public static String getAsJson(RestResponseEnum restResponseEnum){
      JSONObject jsonObject=new JSONObject();
      jsonObject.put("code", restResponseEnum.getCode());
      jsonObject.put("message", restResponseEnum.getMsg());
      return jsonObject.toString();
 }
}

像这样使用:

{
// Your function code
 if(registeredEmailIsFoundInDatabase){
  return RestResponseEnum.getAsJson(RestResponseEnum.DUPLICATE_RECORD);       
 }
}

您应该始终对客户的响应进行说明和澄清 你可以从github:https://api.github.com/users/any/any

处理大多数这样的apis这个方法