2014-04-21 5 views
1

Avant de poster cette question, je cherche beaucoup pour savoir comment demander.OpenDaylight Rest API avec Java

J'essaye de me connecter au contrôleur OpenDaylight avec Java, j'essaye de me connecter en consommant les services de repos donnés par le contrôleur. Mon problème est, quand j'envoie la requête http je ne peux pas aller plus loin que le login, je ne suis pas sûr si c'est possible. Au lieu d'obtenir la topologie ou une autre réponse du contrôleur, j'obtiens le html du formulaire de connexion.

Aussi, je ne suis pas sûr si je devrais me connecter comme ceci.

Toute aide/direction est très appréciée. :)

Mon code pour créer la connexion est:

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

Quand je lance le code, voici ce qui est imprimé:

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

Salut Santiago, url demandez-vous lorsque vous appelez cette fonction '' 'getContent (String urls) t'''? – tangrammer

Répondre

0

Cette lien vous donne la référence complète à tous les Api RESTConf pour ODL: OpenDaylight_Controller:MD-SAL:Model_Reference

Un autre bon endroit pour commencer est ici: OpenDaylight OpenFlow Plugin:User Guide

Par exemple, si vous voulez trouver la topologie que vous devez envoyer une requête GET à: http: //: 8080/restconf/exploitation/réseau topologie: réseau -topologie/topologie/flux: 1/

Ainsi, l'espace de nom URN vous indique quel module/paquet dans le contrôleur ODL auquel vous voulez parler. Un autre exemple est http: //: 8080/restconf/operational/opendaylight-inventory: nodes/node/openflow: 1, qui vous donnera des informations sur le noeud openflow 'openflow: 1' ..

Si vous voulez pousser quelque chose, comme les règles de flux ouvert, il suffit d'attacher le corps XML vers le PUT avec les en-têtes Content-Type ':' application/xml 'et' Accept ':' application/xml. C'est la 'lib' que j'ai créée en python pour mon application. Vous pourriez trouver de l'inspiration.

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 

Oh, et en passant. Un des développeurs OVSDB de ODL a déjà répondu à quelque chose de similaire: networkstatic's answer

+0

Bonjour, après avoir passé beaucoup de temps à essayer d'accéder à l'API OpenDaylight REST avec java, j'ai appris que ce n'était pas la meilleure solution. Si vous voulez accéder de cette façon, c'est mieux avec phyton. Mais si vous voulez travailler avec java, c'est mieux avec l'API java et créez un bundle OpenDaylight. Ce sera beaucoup plus efficace et évolutif. Merci beaucoup pour l'aide et le temps ... Dès que j'aurai fini mon projet, je reviendrai et publierai une page web avec un gros tutoriel sur ce sujet. –

+0

@SantiagoV - Créer votre propre paquet dans maven vous donnera bien entendu plus de possibilités. Donc, si vous maîtrisez parfaitement Java, ce serait peut-être le meilleur cours à suivre. Je ne pense pas que python soit "meilleur". Java peut faire la même chose que python lorsque vous travaillez sur le plan d'application. Tout ce dont vous avez besoin est de bibliothèques pour implémenter les méthodes GET, PUT, DELETE etc. pour REST. PS: Si vous avez terminé un tutoriel, s'il vous plaît coller un lien ici :-) – ErikSorensen

+0

@ ErikSorense- Oui, je suis d'accord avec vous, probablement le mot "mieux" était un peu trompeur .. Je vais poster un tutoriel lorsque je termine :) –

2

Le problème semble être lié à l'authentification. Le nom d'utilisateur et le mot de passe doivent être codés en Base64. S'il vous plaît essayez l'exemple de code ci-dessous, qui obtient les détails de flux au format JSON. Vous pouvez essayer d'obtenir les détails de la topologie de la même manière.

Vous pouvez télécharger le commons-codec bibliothèque de 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(); 
    } 
    } 
}