2014-04-21 2 views
1

이 질문을 게시하기 전에 질문하는 방법을 많이 찾으십시오.OpenDaylight Rest API with 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

here 안녕 산티아고에서 평민 코덱 라이브러리를 다운로드 할 수 있습니다

, 어떤 URL이 기능'''의 getContent (문자열 URL을) t'''를 호출 할 때를 요구하고? – tangrammer

답변

0

이 링크는 ODL에 대한 RESTConf API의 전체 참조를 제공합니다.

또 다른 좋은 출발점은 다음과 같습니다. OpenDaylight OpenFlow Plugin:User Guide

예를 들어 토폴로지를 찾으려면 http : // : 8080/restconf/operational/network-topology : network에 GET 요청을 보내야합니다. 토폴로지/토폴로지/플로우 : 1/

따라서 URN 이름 공간은 ODL 컨트롤러의 어떤 모듈/번들과 통화 할 것인지 알려줍니다. 또 다른 예는 http : // : 8080/restconf/operational입니다./opendaylight-inventory : openflow 노드 'openflow : 1'에 대한 정보를 제공하는 노드/노드/openflow : 1 ...

오픈 플로우 규칙과 같은 것을 푸시하려면 Content-Type ':'application/xml '및'Accept ':'application/xml '과 함께 XML 본문을 PUT에 추가합니다. 이것은 파이썬에서 만든 애플리케이션 용 '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

안녕하세요, 자바로 OpenDaylight REST API에 액세스하는 데 많은 시간을 보낸 후에 이것이 최선의 방법이 아니라는 것을 알게되었습니다. 이 방법에 액세스하려면 Phyton을 사용하는 것이 좋습니다. 그러나 자바로 작업하고 싶다면 자바 API로 더 좋고 OpenDaylight 번들을 생성하십시오. 훨씬 더 효율적이고 확장 성이 있습니다. 도움과 시간을 가져 주셔서 대단히 감사합니다 ... 프로젝트를 마치는대로이 주제에 대한 자습서가있는 웹 페이지를 게시합니다. –

+0

@SantiagoV - maven에서 자신의 번들을 만드는 것은 물론 더 많은 가능성을 제공 할 것입니다. 그래서 당신이 자바에 가장 능숙하다면 취할 수있는 가장 좋은 코스입니다. 나는 파이썬이 '더 나은'것이라고 생각하지 않는다. 자바는 애플리케이션 플레인에서 작업 할 때 파이썬과 동일하게 수행 할 수 있습니다. 필요한 것은 REST를위한 GET, PUT, DELETE 등의 메소드를 구현하는 라이브러리입니다. 추신 : 당신이 튜토리얼을 끝내면, 여기에 링크를 붙여주세요 :-) – ErikSorensen

+0

@ ErikSorense- 예, 아마도 "좋은"이라는 단어가 약간 오도 된 것 같아요. 제가 끝날 때 튜토리얼을 게시 할 것입니다 :) –

2

인증에 문제가있는 것 같습니다. 사용자 이름과 암호는 Base64로 인코딩되어야합니다. 아래의 샘플 코드를 사용하여 JSON 형식의 플로우 세부 정보를 얻으십시오. 같은 방식으로 토폴로지 세부 정보를 가져올 수도 있습니다. 당신은

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