我正在调用一个返回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;
}
}
我的返回值和异常处理是否正常?或者有更好的方法吗?
答案 0 :(得分:1)
如果它是正确的REST服务,它将在http响应代码中添加有关呼叫的其他信息。因此,如果它不以2开头,则根本没有解析响应体(如果没有合同在体内返回错误细节)。
如何处理异常在很大程度上取决于您当前的应用程序。一般经验法则是:
有时候你需要确保封装并在它们发生的地方处理它们,有时可以重新抛出它们在全局捕获它们。例如。您正在使用类似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这个方法