2014-04-21 154 views
1

在发布此问题之前,我搜索很多以确保如何问。OpenDaylight Rest Java与Java

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

此外,我不知道我是否应该像这样连接。

任何帮助/指导,非常感谢。 :)

我的,用于建立连接的代码是:

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

当我运行的代码,这是印:

HTTP/1.1 200 OK

<!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> 
+0

圣地亚哥喜公地编解码器库,其网址你问调用这个函数'''的getContent(字符串URL)的t'''时? – tangrammer

回答

0

这链接为您提供了所有RESTConf Api的ODL全文:OpenDaylight_Controller:MD-SAL:Model_Reference

另一个好地方是:OpenDaylight OpenFlow Plugin:User Guide

例如,如果你想找到拓扑结构,你必须发送一个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正文与PUT一起使用头文件Content-Type':'application/xml'和'Accept':'application/xml。 这是我为我的应用程序在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's answer

+0

你好,花了很多时间试图用java访问OpenDaylight REST api后,我知道这不是最好的方法。如果你想以这种方式访问​​,用phyton更好。但是如果你想用java处理更好的java API并创建一个OpenDaylight Bundle。它将更加高效和可扩展。非常感谢您的帮助和时间......一旦我完成我的项目,我会回来发布一个关于此主题的大教程的网页。 –

+0

@SantiagoV - 在maven中创建自己的包当然会给你更多的可能性。所以如果你最流利的Java可能是最好的选择。我不认为Python是'更好'的。在应用程序平面上工作时,Java可以像python一样执行操作。您只需要一些库来实现REST的GET,PUT,DELETE等方法。 PS:如果你完成了一个教程,请在这里粘贴一个链接:-) – ErikSorensen

+0

@ ErikSorense-是的,我同意你的观点,可能“更好”这个词有点误导我。 –

2

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

您可以从here

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