[英]How to return a value in nested try catch and while loop in java
我正在使用下面的代碼將 SSH 發送到遠程機器並獲取 api_key。 我使用了 try-catch 塊以及 if 和 while 循環來返回 API 鍵值。 以下是步驟 - SSH 到遠程機器運行 cat 命令 cat 命令返回 JSON 數組,如下所示 -
[
{
"apikey": "ewr34234gfdg435",
"app": "app1",
"role": "superadmin",
"user": "req1"
},
{
"apikey": "23rsgsfg3434",
"app": "app1",
"role": "superadmin",
"user": "req2"
}
]
現在,我想檢索只有 user="req2" 的 API 密鑰。
下面是代碼 -
package app1;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.jcraft.jsch.JSchException;
import com.pastdev.jsch.DefaultSessionFactory;
import com.pastdev.jsch.command.CommandRunner;
public class GetAPIKeyValue {
public String getAPIKeyValue(String remote_machine_user,String remote_machine_host, String remote_machine_password) {
String api_key_value = null;
DefaultSessionFactory sessionFactory = new DefaultSessionFactory(remote_machine_user, remote_machine_host, 22);
System.out.println("Connecting to Host : " + remote_machine_host + " As user : " + remote_machine_user);
Map<String, String> props = new HashMap<String, String>();
props.put("StrictHostKeyChecking", "no");
sessionFactory.setConfig(props);
System.out.println("Entering Password on Remote Machine to connect");
sessionFactory.setPassword(remote_machine_password);
CommandRunner runner = new CommandRunner(sessionFactory);
System.out.println("Executing cat command to get apikey on host");
String command = "cat /etc/usr/apikey.sh";
CommandRunner.ExecuteResult result;
try {
result = runner.execute(command);
if (result.getStderr().isEmpty()) {
System.out.println(result.getStdout());
JSONParser jsonParser = new JSONParser();
Object obj = jsonParser.parse(result.getStdout());
JSONArray arrayObj = (JSONArray) obj;
Iterator<JSONObject> iterator = arrayObj.iterator();
while (iterator.hasNext()) {
JSONObject jsonObj = iterator.next();
api_key_value = (String) jsonObj.get("apikey");
String requestor = (String) jsonObj.get("user");
// Would like to condition here i.e if user=="req2" return the API key of user req2.
}
} else {
System.out.println(result.getStderr());
}
} catch (JSchException e) {
System.out.println(e);
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
try {
runner.close();
} catch (IOException e) {
e.printStackTrace();
}
return api_key_value;
}
}
目前我在 try catch“return api_key_value;”結束時返回。 相反,我如何返回 while 語句本身
也許使用 Thread 可以提供幫助。
if(user =="req2") {
String finalApi_key_value = api_key_value;
new Thread(new Runnable() {
@Override
public void run() {
sendApiKeyValue(finalApi_key_value);
}
}).start();
}
並創建一個名為sendApiKeyValue
的方法:
private void sendApiKeyValue(String finalApi_key_value) {
// Do something.
}
我自己解決了這個問題。
while (iterator.hasNext()) {
JSONObject jsonObj = iterator.next();
String user = (String) jsonObj.get("user");
if (user.equals("req2")) {
System.out.println("Got User's API Key");
api_key_value = (String) jsonObj.get("apikey");
break;
} else {
System.out.println("Searching user's API Key");
}
}
簡單點。 只需先重構您的代碼。
public class GetAPIKeyValue {
public static String getApiKeyValue(String remoteMachineUser, String remoteMachineHost, String remoteMachinePassword) throws Exception {
DefaultSessionFactory sessionFactory = new DefaultSessionFactory(remoteMachineUser, remoteMachineHost, 22);
sessionFactory.setConfig(Map.of("StrictHostKeyChecking", "no"));
sessionFactory.setPassword(remoteMachinePassword);
return executeAndGetApiKeyForUser(sessionFactory, "req2");
}
private static String executeAndGetApiKeyForUser(SessionFactory sessionFactory, String user) throws Exception {
try (CommandRunner runner = new CommandRunner(sessionFactory)) {
System.out.println("Executing cat command to get apikey on host");
String command = "cat /etc/usr/apikey.sh";
CommandRunner.ExecuteResult result = runner.execute(command);
if (result.getStderr().isEmpty())
return getApiKeyForUser(result.getStdout(), user);
System.out.println(result.getStderr());
return null;
}
}
private static String getApiKeyForUser(String json, String user) throws ParseException {
JSONArray arrayObj = (JSONArray)new JSONParser().parse(json);
Iterator<JSONObject> it = (Iterator<JSONObject>)arrayObj.iterator();
while (it.hasNext()) {
JSONObject obj = it.next();
if (obj.get("user").equals(user))
return String.valueOf(obj.get("apikey"));
}
return null;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.