2016-08-14 5 views
0

Ich rufe einen REST-Service, der eine JSON-String zurückgibt. Es funktioniert, aber ich bin nicht sicher, wie mit den Ausnahmen umzugehen und Werte zurückzugeben. Hier sind meine zwei Methoden, die ich schrieb:Java: Exception und Return Value-Behandlung in REST-Service konsumieren

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; 
    } 
} 

Ist mein Rückgabewert und Ausnahmebehandlung ok? Oder gibt es einen besseren Weg, dies zu tun?

+0

Sie sollten 'disconnect' innerhalb eines 'finally'-Blocks aufrufen, so dass es auch im Fehlerfall aufgerufen wird. – johnnyaug

+0

Ok, du hast Recht. Was ist mit Ausnahmen und den Rückgabewerten im Fehlerfall? – SpaceJump

+0

Es liegt an Ihnen, wie Sie mit Ausnahmen umgehen und was Sie in solchen Fällen zurückgeben möchten. Im Allgemeinen sollten Sie Ausnahmen protokollieren, damit Sie wissen, dass sie aufgetreten sind. – johnnyaug

Antwort

1

Wenn es sich um einen ordnungsgemäßen REST-Dienst handelt, werden im HTTP-Antwortcode zusätzliche Informationen zu einem Anruf hinzugefügt. Wenn es also nicht mit 2 beginnt, hat es keinen Sinn, den Antworttext überhaupt zu analysieren (falls es keinen Vertrag gibt, Fehlerdetails im Hauptteil zurückzugeben).

Wie Sie mit Ihrer Ausnahme umgehen, hängt stark von Ihrer aktuellen Anwendung ab. Allgemeine Faustregeln sind:

  1. Log Ausnahmen
  2. Handle sie auf einem angemessenen Niveau

Manchmal müssen Sie Verkapselung, um sicherzustellen, und sie zu behandeln, in denen sie auftreten, manchmal ist es in Ordnung, sie einen Haken erneut auslösen sie global. Z.B. Sie verwenden ein Framework wie JSF, der Benutzer hat einen externen Serviceaufruf ausgelöst, die Ausnahme protokolliert, erneut gestartet, abgefangen und den Benutzer darüber informiert, ohne zu viele technische Details zu teilen. Wie:

Error: YOUR_ERROR_CODE has occured. Please contact technical support if this keeps happening.

Beispiel:

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(...); 
} 
... 

Aber ob diese Lösung für Ihren Fall gut ist, hängt von Ihrer Architektur.

1

Für eine bessere Client-Seite Umgang mit Ihnen eine Enum mit Rückfällen zum Beispiel sollte wie folgt sein, wenn wir bauen ein Registrierungsmodul Ihre Enum haben sollte:

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(); 
} 
} 

Verwenden Sie es wie folgt aus:

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

Sie sollten immer flackern und die Antwort auf den Client klären Sie können diese Methodik aus dem Umgang mit den meisten Apis wie diesem von github sehen: https://api.github.com/users/any/any