使用Java的OpenDaylight Rest API

在发布这个问题之前,我搜索了很多,以确定如何提问。

我试图用Java连接到OpenDaylight控制器,我试图通过使用控制器给出的其余服务来连接。 我的问题是,当我发送http请求时,我无法获得任何进一步的登录,我不确定它是否可能。 我没有从控制器获取拓扑或其他答案,而是获取登录表单的html。

另外,我不确定我是否应该像这样连接。

任何帮助/指导非常感谢。 🙂

我创建连接的代码是:

public String getContent(String urls) throws IOException { String cont=""; CloseableHttpClient httpclient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(urls); List  nvps = new ArrayList (); 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; } 

当我运行代码时,这就是打印的内容:

HTTP / 1.1 200好的

     OpenDaylight - Login   less = { env: "production" };     

问题似乎与身份validation有关。 用户名和密码必须编码为Base64。 请尝试下面的示例代码,它以JSON格式获取流程详细信息。 您可以尝试以相同的方式获取拓扑详细信息。

您可以从这里下载commons-codec库

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

此链接为您提供ODL的所有RESTConf Api的完整参考: OpenDaylight_Controller:MD-SAL:Model_Reference

另一个好的起点是: OpenDaylight OpenFlow插件:用户指南

例如,如果要查找拓扑,则必须向以下位置发送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主体与标题Content-Type’:’application / xml’和’Accept’:’application / xml一起附加到PUT。 这是我在python中为我的应用程序创建的’lib’。 你可能会找到一些灵感。

 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开发人员回答了类似的问题 : networkstatic的回答