使用Java的OpenDaylight Rest API
在发布这个问题之前,我搜索了很多,以确定如何提问 我试图用Java连接到OpenDaylight控制器,我试图通过使用控制器提供的rest服务进行连接。我的问题是,当我发送http请求时,除了登录之外,我无法获得任何其他信息,我不确定这是否可能。我不是从控制器获取拓扑或其他答案,而是获取登录表单的html 另外,我不确定我是否应该像这样连接 非常感谢您的帮助/指导。:) 我创建连接的代码是:使用Java的OpenDaylight Rest API,java,rest,login,connection,opendaylight,Java,Rest,Login,Connection,Opendaylight,在发布这个问题之前,我搜索了很多,以确定如何提问 我试图用Java连接到OpenDaylight控制器,我试图通过使用控制器提供的rest服务进行连接。我的问题是,当我发送http请求时,除了登录之外,我无法获得任何其他信息,我不确定这是否可能。我不是从控制器获取拓扑或其他答案,而是获取登录表单的html 另外,我不确定我是否应该像这样连接 非常感谢您的帮助/指导。:) 我创建连接的代码是: public String getContent(String urls) throws IOExce
public String getContent(String urls) throws IOException {
String cont="";
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(urls);
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("j_username", "username"));
nvps.add(new BasicNameValuePair("j_password", "password"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response2 = httpclient.execute(httpPost);
try {
System.out.println(response2.getStatusLine());
HttpEntity entity2 = response2.getEntity();
BufferedReader reader =new BufferedReader(new InputStreamReader(entity2.getContent()));
String line="";
while((line=reader.readLine())!=null){
cont+=line+"\n";
}
} finally {
response2.close();
}
return cont;
}
publicstringgetcontent(字符串URL)引发异常{
字符串cont=“”;
CloseableHttpClient httpclient=HttpClients.createDefault();
HttpPost HttpPost=新的HttpPost(URL);
List-nvps=newarraylist();
添加(新的BasicNameValuePair(“j_用户名”、“用户名”);
添加(新的BasicNameValuePair(“j_密码”、“密码”);
setEntity(新的UrlEncodedFormEntity(nvps));
CloseableHttpResponse response2=httpclient.execute(httpPost);
试一试{
System.out.println(response2.getStatusLine());
HttpEntity entity2=response2.getEntity();
BufferedReader=new BufferedReader(new InputStreamReader(entity2.getContent());
字符串行=”;
而((line=reader.readLine())!=null){
cont+=行+“\n”;
}
}最后{
response2.close();
}
返回控制;
}
当我运行代码时,将打印以下内容:
HTTP/1.1200ok
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>OpenDaylight - Login</title>
<script src="/js/bootstrap.min.js"></script>
<script type="text/javascript">
less = {
env: "production"
};
</script>
<script src="/js/less-1.3.3.min.js"></script>
</head>
<body>
<form action="j_security_check;jsessionid=LONGID" id="form" method="post">
<div class="container">
<div class="content">
<div class="login-form">
<div id="logo"></div>
<fieldset>
<div class="control-group">
<input type="text" name="j_username" placeholder="Username">
</div>
<div class="control-group">
<input type="password" name="j_password" placeholder="Password">
</div>
<button class="btn btn-primary" type="submit" value="Log In" >
<div class="icon-login"></div> Log In</button>
</fieldset>
</div>
</div>
</div>
</form>
</body>
</html>
OpenDaylight-登录
减={
环境:“生产”
};
登录
此链接提供了ODL所有RESTConf Api的完整参考:
另一个好的起点是:
例如,如果要查找拓扑,必须将GET请求发送到:
http://:8080/restconf/operational/network-topology:network-topology/topology/flow:1/
因此,URN名称空间告诉您要与ODL控制器中的哪个模块/包通信。。
另一个例子是http://:8080/restconf/operational/opendaylight inventory:nodes/node/openflow:1,它将为您提供有关openflow节点“openflow:1”的信息
如果要推送某些内容,例如openflow规则,只需将XML正文附加到“拼凑标题”内容类型“:“application/XML”和“Accept”:“application/XML”。
这是我用python为我的应用程序创建的“库”。你可能会找到一些灵感
import sys
import json
import httplib2
#Base URLs for Config and operational
baseUrl = 'http://192.168.231.246:8080'
confUrl = baseUrl + '/restconf/config/'
operUrl = baseUrl + '/restconf/operational/'
#"Old" REST APIs that still are used
sdSalUrl = baseUrl + '/controller/nb/v2/'
#Specific REST URLs
findNodes = operUrl + '/opendaylight-inventory:nodes/'
findTopo = operUrl + '/network-topology:network-topology/'
findNodeConnector = operUrl + '/opendaylight-inventory:nodes/node/node-connector/'
findTopology = operUrl + '/network-topology:network-topology/topology/flow:1/'
findFlow = confUrl +'/opendaylight-inventory:nodes/node/openflow:1/table/0/'
h = httplib2.Http(".cache")
h.add_credentials('admin', 'admin')
#Functions for
def get(url):
resp, xml = h.request(
url,
method = "GET",
headers = {'Content-Type' : 'application/xml'}
)
return xml
def put(url, body):
resp, content = h.request(
url,
method = "PUT",
body = body,
headers = {'Content-Type' : 'application/xml', 'Accept':'application/xml'}
)
return resp, content
def delete(url):
resp, content = h.request(
url,
method = "DELETE"
)
return resp
def get_active_hosts():
resp, content = h.request(sdSalUrl + 'hosttracker/default/hosts/active/', "GET")
hostConfig = json.loads(content)
hosts = hostConfig['hostConfig']
return hosts
哦,顺便说一下。ODL的一位OVSDB开发人员在前面回答了类似的问题:问题似乎在于身份验证。用户名和密码必须编码为Base64。请尝试下面的示例代码,它以JSON格式获取流详细信息。您可以尝试以相同的方式获取拓扑详细信息 您可以从下载commons编解码器库
你好,Santiago,当调用此函数时,您需要哪个url
getContent(stringurl)t
?您好,在花了很多时间尝试使用java访问OpenDaylight REST api后,我了解到这不是最好的方法。如果您想以这种方式访问,最好使用phyton。但是如果您想使用java,最好使用JavaAPI并创建OpenDaylight捆绑包。它将更加高效和可扩展。非常感谢您的帮助和时间。。。一旦我完成我的项目,我会回来发布一个关于这个主题的大型教程的网页。@SantiagoV-在maven中创建自己的包当然会给你更多的可能性。因此,如果您最精通Java,那么这可能是最好的选择。我不认为python“更好”。在应用程序平面上工作时,Java可以做与python相同的事情。您只需要一些库来实现REST的GET、PUT、DELETE等方法。PS:如果你完成了一个教程,请在这里粘贴一个链接:-)@ErikSorense-是的,我同意你的观点,也许“更好”这个词有点误导。。我将在完成后发布教程:)
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.codec.binary.Base64;
public class OpenDayLightUtils {
public static void getFlowDetails() {
String user = "admin";
String password = "admin";
String baseURL = "http://192.168.100.1:8080/controller/nb/v2/flowprogrammer";
String containerName = "default";
try {
// Create URL = base URL + container
URL url = new URL(baseURL + "/" + containerName);
// Create authentication string and encode it to Base64
String authStr = user + ":" + password;
String encodedAuthStr = Base64.encodeBase64String(authStr.getBytes());
// Create Http connection
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Set connection properties
connection.setRequestMethod("GET");
connection.setRequestProperty("Authorization", "Basic " + encodedAuthStr);
connection.setRequestProperty("Accept", "application/json");
// Get the response from connection's inputStream
InputStream content = (InputStream) connection.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(content));
String line = "";
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}